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

标签 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);
}

我得到的信息是:

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

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

问题由 Neil+Konrad 解决。请参阅下面对尼尔回答的评论。

最佳答案

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

int main()
{
   X my_x(X::A);
}

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

解决方案是在 X 周围引入多余的括号,因为编译器禁止在类型周围使用括号(与构造调用等相反):

(X(X::A));

关于编译器无法正确识别 C++ 枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/681518/

相关文章:

c++ - Qt windeployqt 失败,出现 : does not seem to be a Qt executable?

inheritance - F# 添加多个调用基类构造函数的构造函数重载

jsf - 从 JSF @ManagedBean 迁移到 CDI @Named 后,多次调用构造函数并且提交的输入值始终为空

java - 如何使用在编译时设置的动态数量的参数创建 java 方法(类似 lombok 的行为)

java - 这个构造函数是如何工作的?

c++ - 使用 Boost.build 构建并链接到 boost

c++ - 指向特定类型的 STL 容器样式和迭代器 (C++)

c++ - "A case label may only be used within a switch"

java - 使用 Gson 显示枚举及其属性的映射

java - 获取枚举的字符串值