首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++11 std::复制内部函数

C++11 std::复制内部函数
EN

Stack Overflow用户
提问于 2014-04-12 19:44:06
回答 2查看 220关注 0票数 1

我正在编写一个新的跨平台工具箱,并希望与C++11扩展更新。我遇到了一个问题,在那里std::copy的行为不像我预期的那样。如果有人有解释的话,我会非常感激的。

我完全理解我得到的错误,解决方法就是使用老式的memcpy,但是如果有一个解决方案,我可以在这里使用std::copy,我会很感激的。

我得到的错误是:

错误:调用‘begin(const*&)’没有匹配函数

我使用gcc 4.7.2-5启用了C++11 .

在set函数中,我得到了std::copy的错误

代码语言:javascript
复制
#include <vector>
#include <array>
#include <algorithm>
#include <cstring>

class A {
public:
  float data[3];
  void set(const float c[3]) {
    std::copy(std::begin(c),std::end(c), std::begin(data));
  }
};

int main() {
  const float a[3] = {1,2,3};
  float b[] = {4,5,6};
  std::copy(std::begin(a),std::end(a), std::begin(b));
  return 0;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-12 19:47:15

由于C遗留兼容性,const float c[3]作为函数参数长期适用于const float* c

尝试const float (&c)[3]std::array<float,3> const& c等。

我自己也喜欢template<class T>using Type=T; Type<float[3]> const& c

票数 2
EN

Stack Overflow用户

发布于 2014-04-12 19:47:05

这个函数参数

代码语言:javascript
复制
const float c[3]

实际上是指向floatconst float*的指针。它令人困惑,而且实际上用来记录参数应该是一个数组,但是任何float*都可以传递给它。在函数内部,c是一个指针,这就是为什么std::begin不能工作的原因。

如果要将对数组的引用传递给函数,则需要使用不同的语法:

代码语言:javascript
复制
void set(const float (&c)[3]);

或者,您可以使用用户定义的数组类型std::array<float, 3>

注意,std::beginstd::end位于<iterator>头中。还请注意,您可以使用旧的方法:

代码语言:javascript
复制
std::copy(c, c + 3, &data[0]);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23035273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档