我刚刚收到此错误:"错误:'符号'未命名类型"
我发现其他一些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)
答案 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.8
? 2.8
非常古老(16岁),所以它甚至不完全符合4.8
。
答案 1 :(得分:2)
您所看到的是名称隐藏的形式:将优先于Symbol
([basic.scope。隐藏]§3.3.10/ 2)。在C ++允许一个声明在同一范围内隐藏另一个声明的情况下,总会有一个 elaborated-type-specifier 仍然引用隐藏声明。它们之所以如此命名是因为只有类型(class Symbol
或class
)才能以这种方式隐藏; typedef和模板不能。声明的顺序并不重要。
在这种情况下,当变量或函数在范围内时,您可以使用enum
来引用类:
class Symbol