编译器无法正确识别C++枚举

Ari*_*Ari 4 c++ enums constructor temporary

谁能解释为什么以下代码无法编译(在g ++(GCC)3.2.3 20030502(Red Hat Linux 3.2.3-49))?

struct X {
public:
   enum State { A, B, C };

   X(State s) {}
};

int main()
{
   X(X::A);
}
Run Code Online (Sandbox Code Playgroud)

我收到的消息是:

jjj.cpp:在函数'int main()'中:
jjj.cpp:10:'XX :: A'不是'struct
X'jjj.cpp 的静态成员:10:没有用于调用'X的匹配函数: :X()'
jjj.cpp:1:候选者是:X :: X(const X&)
jjj.cpp:5:X :: X(X :: State)`

这是错误的代码还是编译器错误?

Neil + Konrad解决了问题.请参阅下面对Neil的回答的评论.

Kon*_*lph 10

您已经忘记了定义中的变量名称:

int main()
{
   X my_x(X::A);
}
Run Code Online (Sandbox Code Playgroud)

您的代码会混淆编译器,因为它在语法上无法将其与函数声明(返回XX::A作为参数传递)区分开来.如果有疑问,C++编译器总是消除歧义,支持声明.

解决方案是引入冗余括号,X因为编译器禁止围绕类型括号(而不是构造调用等):

(X(X::A));
Run Code Online (Sandbox Code Playgroud)


小智 8

X(X::A);
Run Code Online (Sandbox Code Playgroud)

被视为功能声明.如果您真的想要这个代码,请使用:

(X)(X::A);
Run Code Online (Sandbox Code Playgroud)