C++ ISO C&x2B+;禁止转发对';枚举';类型
鉴于该计划:C++ ISO C&x2B+;禁止转发对';枚举';类型,c++,clang,C++,Clang,鉴于该计划: enum E : int { A, B, C }; g++-c测试.cpp工作正常。但是,clang++-c test.cpp给出了以下错误: test.cpp:1:6: error: ISO C++ forbids forward references to 'enum' types enum E : int ^ test.cpp:1:8: error: expected unqualified-id enum E : int ^ 2 error
enum E : int
{
A, B, C
};
g++-c测试.cpp
工作正常。但是,clang++-c test.cpp
给出了以下错误:
test.cpp:1:6: error: ISO C++ forbids forward references to 'enum' types
enum E : int
^
test.cpp:1:8: error: expected unqualified-id
enum E : int
^
2 errors generated.
这些错误消息对我来说毫无意义。我在这里没有看到任何正向引用。为枚举指定基础类型是C++11语言的一项功能。要获得要编译的代码,必须添加开关
-std=c++11
。这适用于GCC和Clang
对于C++03中的枚举,基础整数类型是实现定义的,除非枚举数的值不能放入整数或无符号整数。(但是,自VS2005以来,Microsoft的编译器允许将枚举的基础类型指定为专有扩展。)FWIW,GCC now(从5或6开始)编译时默认使用
-std=c++14
,而Clang仍然使用-std=c++98
AFAIK。我认为如果您包含编译器版本和选项,会有所帮助。这对我来说似乎是一个合理的问题,不是印刷错误,这不是一个不包含代码和错误消息的问题,而是一个寻求调试帮助的问题。我们没有投票,但是当您使用c++11功能并收到奇怪的错误消息时,使用-std=c++11
是第一件要尝试的事。当时我不知道这是一个c++11功能。语法不是新的-MS编译器至少从VS2005开始就支持此语法。你说得对:如果使用选项-std=c++11编译,则为works()。如果gcc大于6,则会给您一个明确的警告。对于gcc 6,std标志没有nead。@Christophe:也就是说:对于gcc 6,他们(最终)默认将其更改为编译C++11,并且需要一个开关以符合旧标准。