4

我查看了作为 Stackoverflow 认为可能已经有答案的问题提出的各种选项,但我没有看到任何接近的问题。

示例代码:

#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 没有类类型。

据我所见,一切都是正确的,复制构造函数采用 const 引用,因此它应该可以与正在使用的临时对象一起正常工作。

那么错误的原因是什么?

4

2 回答 2

11

编译器认为 test2 是一个函数!阅读最令人头疼的解析

您可以使用以下两种方法中的任何一种来解决此问题:

v2 const test2((v2(angle)));  // before C++11

v2 const test2{v2(angle)};    // C++11 uniform initialization
于 2015-09-14T19:54:50.110 回答
10

你已经成为最令人烦恼的解析的受害者。在您的代码中,您已声明test2为函数。解决此问题的一种方法是添加一组额外的括号:v2 const test2((v2(angle)));.

于 2015-09-14T19:55:21.403 回答