c++ - 未命名类型错误是由于现有枚举造成的,但为什么呢?

标签 c++ c++11 enums name-hiding

我刚刚收到此错误:“错误:‘符号’未命名类型”

我发现其他一些 StackOverflow 问题讨论了循环依赖关系,但这里的情况并非如此。事实上,我可以通过将其放在源文件的顶部来重现它:

class Symbol{int dummy;};
//class Symbol{int again;};
Symbol global_symbol;

这在第三行给出了“错误:‘Symbol’没有命名类型”。如果我取消注释第二行,我仍然会得到同样的错误,但就在它之前我现在得到:“错误:‘类符号’的重新定义”!!

经过大量研究后,发现第 3 方库有一个定义了 Symbolenum 。该库和我自己的代码都不使用命名空间,因此将我的代码移动到命名空间内已经在我的待办事项列表中,我接下来会这样做,希望问题会消失。

但令我困惑的是,为什么我在 class Symbol{} 行上没有收到错误?如果它与枚举冲突,以至于我永远无法实例化该类,为什么它不提示?我觉得我要么缺少 g++ 标志,要么我的 C++ 知识存在差距。我准备好等待有人告诉我这是一个功能而不是一个错误。

(顺便说一句,我正在使用 g++ -c -std=gnu++0x -Wall -g -Werror ... 和 g++ 4.8.1)

最佳答案

您所看到的是一种名称隐藏:变量或函数Symbol的声明将优先于类Symbol被发现>([basic.scope.hiding] §3.3.10/2)。在 C++ 允许一个声明隐藏同一作用域中的另一个声明的情况下,总是有一个仍然引用隐藏声明的详细类型说明符。它们之所以如此命名,是因为只有类型(classenum)可以通过这种方式隐藏; typedef 和模板不能。声明的顺序并不重要。

在这种情况下,当变量或函数在作用域内时,您可以使用class Symbol来引用类:

class Symbol global_symbol;

关于c++ - 未命名类型错误是由于现有枚举造成的,但为什么呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23355501/

相关文章:

c++ - 是否可以使用 C++11 中的后续顺序一致加载对存储发布进行重新排序?

c++ - constexpr 说明符性能不符合我在 C++ 中的预期

java - 在枚举 Java 中使用数组

mysql - 如何在 Doctrine 中将鉴别器列定义为类表继承的 ENUM?

c++ - 使用 crypto++ 库进行 RAW RSA 签名验证

c++ - 在布局上调整 QGraphicsView 小部件的大小

c++ - 在 C 中的 switch 语句中写入多个内容

c++ - 使用我自己的源目录生成 vs2010 项目文件

c++ - 带双引号的字符串初始化

Perl 内联 Java 中的 Java 枚举