没有命名类型错误是由于现有的枚举,但为什么?

时间:2014-04-29 04:29:31

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

我刚刚收到此错误:"错误:'符号'未命名类型"

我发现其他一些StackOverflow问题谈论循环依赖,但这不是这里的情况。事实上,我可以通过将它放在源文件的顶部来重现它:

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

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

经过多次讨论后,第三方图书馆的enum定义了Symbol。这个库和我自己的代码都没有使用命名空间,所以当我将代码移到命名空间中时,我已经在我的待办事项列表中了,我接下来会这样做,希望问题会消失。

但令我困惑的是为什么我没有在class Symbol{}行上收到错误?如果它与枚举冲突,在某种程度上我永远无法实例化那个类,为什么它没有抱怨呢?我觉得我错过了g++的标志,或者我的C ++知识存在差距。我支持自己让别人告诉我这是一个功能,而不是一个错误。

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

2 个答案:

答案 0 :(得分:2)

gcc错误消息不是最友好的,因为C++具有相当复杂的语法,并且解析器有时会被最小的错误完全混淆,例如缺少{{} 1}}。例如,您的表单代码

;

enum A{Symbol=0}; class Symbol{int dummy;}; int main() { Symbol global_symbol; } 之前声明enum的{​​{1}}给出了以下编译错误(我使用Symbol):

class Symbol

所以最好的办法是在代码中使用命名空间,或者更改类名:) 你提到你使用了g++4.8。您的意思是minimal.cpp: In function 'int main()': minimal.cpp:13:9: error: expected ';' before 'global_symbol' Symbol global_symbol; ^ minimal.cpp:13:22: warning: statement has no effect [-Wunused-value] Symbol global_symbol; 还是g++2.82.8非常古老(16岁),所以它甚至不完全符合4.8

答案 1 :(得分:2)

您所看到的是名称隐藏的形式:将优先于Symbol([basic.scope。隐藏]§3.3.10/ 2)。在C ++允许一个声明在同一范围内隐藏另一个声明的情况下,总会有一个 elaborated-type-specifier 仍然引用隐藏声明。它们之所以如此命名是因为只有类型(class Symbolclass)才能以这种方式隐藏; typedef和模板不能。声明的顺序并不重要。

在这种情况下,当变量或函数在范围内时,您可以使用enum来引用类:

class Symbol