我正在编写一个新的跨平台工具箱,并希望与C++11扩展更新。我遇到了一个问题,在那里std::copy的行为不像我预期的那样。如果有人有解释的话,我会非常感激的。
我完全理解我得到的错误,解决方法就是使用老式的memcpy,但是如果有一个解决方案,我可以在这里使用std::copy,我会很感激的。
我得到的错误是:
错误:调用‘begin(const*&)’没有匹配函数
我使用gcc 4.7.2-5启用了C++11 .
在set函数中,我得到了std::copy的错误
#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;
}发布于 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。
发布于 2014-04-12 19:47:05
这个函数参数
const float c[3]实际上是指向float或const float*的指针。它令人困惑,而且实际上用来记录参数应该是一个数组,但是任何float*都可以传递给它。在函数内部,c是一个指针,这就是为什么std::begin不能工作的原因。
如果要将对数组的引用传递给函数,则需要使用不同的语法:
void set(const float (&c)[3]);或者,您可以使用用户定义的数组类型std::array<float, 3>。
注意,std::begin和std::end位于<iterator>头中。还请注意,您可以使用旧的方法:
std::copy(c, c + 3, &data[0]);https://stackoverflow.com/questions/23035273
复制相似问题