C++ 复制构造函数失败
C++ copy constructor failure
我查看了作为问题建议的各种选项,Whosebug 认为这些选项可能已经有了答案,但我所看到的没有一个接近。
示例代码:
#include <math.h>
class v2
{
public:
float x;
float y;
v2(float angle) : x(cos(angle)), y(sin(angle)) {}
v2(const v2 &v) : x(v.x), y(v.y) {}
};
int main(int argc, char **argv)
{
float const angle(1.0f);
v2 const test1(angle);
v2 const test2(v2(angle));
v2 const test3(test1);
float const x1(test1.x);
float const y1(test1.y);
float const x2(test2.x); // These two lines fail, claiming left of .x must have class type.
float const y2(test2.y);
float const x3(test3.x);
float const y3(test3.y);
return 0;
}
这是来自 VS 2010 的 MSVC。test2 的创建编译正确,但访问其成员失败,声称 test2 没有 class 类型。
据我所知,一切都是正确的,复制构造函数采用 const 引用,因此它应该可以正常使用临时文件。
那么错误的原因是什么?
编译器认为test2是一个函数!
了解 most vexing parse.
您可以使用以下两种方法之一解决此问题:
v2 const test2((v2(angle))); // before C++11
v2 const test2{v2(angle)}; // C++11 uniform initialization
您已成为 most vexing parse 的受害者。在您的代码中,您已将 test2
声明为函数。解决此问题的一种方法是添加一组额外的括号:v2 const test2((v2(angle)));
.
我查看了作为问题建议的各种选项,Whosebug 认为这些选项可能已经有了答案,但我所看到的没有一个接近。
示例代码:
#include <math.h>
class v2
{
public:
float x;
float y;
v2(float angle) : x(cos(angle)), y(sin(angle)) {}
v2(const v2 &v) : x(v.x), y(v.y) {}
};
int main(int argc, char **argv)
{
float const angle(1.0f);
v2 const test1(angle);
v2 const test2(v2(angle));
v2 const test3(test1);
float const x1(test1.x);
float const y1(test1.y);
float const x2(test2.x); // These two lines fail, claiming left of .x must have class type.
float const y2(test2.y);
float const x3(test3.x);
float const y3(test3.y);
return 0;
}
这是来自 VS 2010 的 MSVC。test2 的创建编译正确,但访问其成员失败,声称 test2 没有 class 类型。
据我所知,一切都是正确的,复制构造函数采用 const 引用,因此它应该可以正常使用临时文件。
那么错误的原因是什么?
编译器认为test2是一个函数! 了解 most vexing parse.
您可以使用以下两种方法之一解决此问题:
v2 const test2((v2(angle))); // before C++11
v2 const test2{v2(angle)}; // C++11 uniform initialization
您已成为 most vexing parse 的受害者。在您的代码中,您已将 test2
声明为函数。解决此问题的一种方法是添加一组额外的括号:v2 const test2((v2(angle)));
.