谁能解释为什么以下代码无法编译(在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); }
我收到的消息是:
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的回答的评论.
您已经忘记了定义中的变量名称:
int main() { X my_x(X::A); }
您的代码会混淆编译器,因为它在语法上无法将其与函数声明(返回X
并X::A
作为参数传递)区分开来.如果有疑问,C++编译器总是消除歧义,支持声明.
解决方案是引入冗余括号,X
因为编译器禁止围绕类型括号(而不是构造调用等):
(X(X::A));
X(X::A);
被视为功能声明.如果您真的想要这个代码,请使用:
(X)(X::A);