不命名类型错误是由于现有枚举造成的,但原因是什么
Does not name a type error is due to existing enum, but why?
我刚刚收到这个错误:"错误:‘Symbol’没有命名类型"
我发现了一些关于循环依赖关系的其他StackOverflow问题,但这里的情况并非如此。事实上,我可以通过将其放在源文件的顶部来复制它:
class Symbol{int dummy;};
//class Symbol{int again;};
Symbol global_symbol;
这为第三行提供了"错误:'Symbol'没有命名类型"。如果我取消对第二行的注释,我仍然会得到同样的错误,但就在它之前,我现在得到:"错误:'classSymbol'的重新定义"!!
经过更多的探索,第三方库似乎有一个enum
,其中定义了Symbol
。那个库和我自己的代码都不使用名称空间,所以把我的代码移动到名称空间内已经在我的待办事项列表中了,我下一步会这样做,希望这个问题会消失。
但让我困惑的是,为什么我在class Symbol{}
线上没有出现错误?如果它与枚举冲突,以至于我永远无法实例化该类,为什么它没有抱怨?我觉得我要么错过了g++
的标志,要么我的C++知识有差距。我正在为有人告诉我这是一个功能而不是bug做好准备。
(顺便说一句,我使用的是g++ -c -std=gnu++0x -Wall -g -Werror ...
和g++4.8.1)
您看到的是名称隐藏的一种形式:变量或函数Symbol
的声明将优先于class Symbol
([basic.scope.hiding]§3.3.10/2)。在C++允许一个声明在同一范围内隐藏另一个声明的情况下,总是有一个详细说明的类型说明符,它仍然引用隐藏的声明。它们之所以如此命名,是因为只有一个类型(class
或enum
)可以以这种方式隐藏;typedefs和templates不能。申报顺序不重要。
在这种情况下,当变量或函数在作用域中时,可以使用class Symbol
来引用类:
class Symbol global_symbol;
gcc
错误消息不是最方便用户使用的,因为C++
有相当复杂的语法,解析器有时会被最小的错误完全混淆,例如缺少;
。例如,形式的代码
enum A{Symbol=0};
class Symbol{int dummy;};
int main()
{
Symbol global_symbol;
}
其中具有Symbol
的enum
在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
还是4.8
?2.8
相当古老(已有16年历史),因此它甚至不完全符合C++98
。
- 隐式不是带有枚举解释的运算符 (!)?
- 表达式必须是带有枚举的可修改左值
- 将枚举与 CMake 链接的正确方法是什么?
- 调用模板化类内的枚举类枚举器的正确语法是什么
- 在C++中向枚举添加"all"选项的好设计是什么?
- 我应该使用什么而不是模板的枚举
- 在Visual Studio中定义与Typedef枚举发生冲突的原因是什么?
- 在 .NET 中调用 COM 枚举器的正确方法是什么?
- 在枚举上使用的正确铸件是什么
- 无法理解C++中的枚举,它们实际上是什么?
- Qt:Q_OBJECT中枚举的meta.enumeratorCount()没有元数据,原因是什么
- 传递枚举数组是什么意思
- 继承类之间的枚举的最佳实践是什么?
- "<<"(双尖括号)在 C/C++ 枚举中是什么意思?
- 这个枚举在析构函数中的用途是什么
- 是空枚举 ( enum{}; ) 可移植的
- C++中默认初始化的全局强类型枚举是什么
- 这是使用枚举数的好方法
- 这个 C++ [out] 参数是指向枚举的指针,还是只是一个值
- 最佳实践是使用枚举使用按位参数组合