2

我刚刚收到这个错误:“错误:'Symbol'没有命名类型”

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

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

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

经过更多的探索之后,似乎第 3 方库定义了一个enumwhere 。Symbol那个库和我自己的代码都没有使用命名空间,因此将我的代码移动到命名空间内已经在我的待办事项列表中,我接下来会这样做,希望问题会消失。

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

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

4

2 回答 2

2

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

enum A{Symbol=0};

class Symbol{int dummy;};

int main() 
{
    Symbol global_symbol;
}   

在给我以下编译错误之前声明了enuma的地方(我使用):Symbolclass Symbolg++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.84.82.8相当古色古香(16岁),所以它甚至不完全C++98合规。

于 2014-04-29T04:36:35.443 回答
2

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

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

class Symbol global_symbol;
于 2014-04-29T04:53:23.080 回答