enum类嵌套在类编译在Linux上,但不是MacOS?



我写了一个基本的程序来显示我正在处理的问题。

#include <iostream>
using namespace std;
class SomeClass {
private:
public:
enum class SomeEnum : int {a, b, c};
void print() {
cout << "test";
}
};
int main() {
SomeClass::SomeEnum test1 = SomeClass::SomeEnum::a;
SomeClass::SomeEnum test2 = SomeClass::SomeEnum::b;
SomeClass::SomeEnum test3 = SomeClass::SomeEnum::c;
}
基本上,有一个枚举类嵌套在另一个类中。当我尝试在Linux上编译它时,没有问题。在MacOS上编译这段代码会给我带来如下问题:
test.cpp:8:10: warning: scoped enumerations are a C++11 extension [-Wc++11-extensions]
enum class SomeEnum : int {a, b, c};
^
test.cpp:8:10: error: reference to enumeration must use 'enum' not 'enum class' [-Welaborated-enum-class]
enum class SomeEnum : int {a, b, c};
^~~~~~
test.cpp:8:31: error: expected '(' for function-style cast or type construction
enum class SomeEnum : int {a, b, c};
~~~ ^
test.cpp:16:5: error: no type named 'SomeEnum' in 'SomeClass'; did you mean simply 'SomeEnum'?
SomeClass::SomeEnum test1 = SomeClass::SomeEnum::a;
^~~~~~~~~~~~~~~~~~~
SomeEnum
test.cpp:8:16: note: 'SomeEnum' declared here
enum class SomeEnum : int {a, b, c};
^
test.cpp:16:44: error: 'SomeEnum' is not a class, namespace, or enumeration
SomeClass::SomeEnum test1 = SomeClass::SomeEnum::a;
^
test.cpp:17:25: error: use of undeclared identifier 'test2'; did you mean 'test1'?
SomeClass::SomeEnum test2 = SomeClass::SomeEnum::b;
^~~~~
test1
test.cpp:16:25: note: 'test1' declared here
SomeClass::SomeEnum test1 = SomeClass::SomeEnum::a;
^
test.cpp:17:24: error: expected ';' after expression
SomeClass::SomeEnum test2 = SomeClass::SomeEnum::b;
^
;
test.cpp:17:16: error: no member named 'SomeEnum' in 'SomeClass'
SomeClass::SomeEnum test2 = SomeClass::SomeEnum::b;
~~~~~~~~~~~^
test.cpp:17:44: error: 'SomeEnum' is not a class, namespace, or enumeration
SomeClass::SomeEnum test2 = SomeClass::SomeEnum::b;
^
test.cpp:18:25: error: use of undeclared identifier 'test3'; did you mean 'test1'?
SomeClass::SomeEnum test3 = SomeClass::SomeEnum::c;
^~~~~
test1
test.cpp:16:25: note: 'test1' declared here
SomeClass::SomeEnum test1 = SomeClass::SomeEnum::a;
^
test.cpp:18:24: error: expected ';' after expression
SomeClass::SomeEnum test3 = SomeClass::SomeEnum::c;
^
;
test.cpp:18:16: error: no member named 'SomeEnum' in 'SomeClass'
SomeClass::SomeEnum test3 = SomeClass::SomeEnum::c;
~~~~~~~~~~~^
test.cpp:18:44: error: 'SomeEnum' is not a class, namespace, or enumeration
SomeClass::SomeEnum test3 = SomeClass::SomeEnum::c;
^
1 warning and 12 errors generated.

我不太确定是什么问题。我不允许在其他类中嵌套枚举类吗?为什么它在Linux上编译时没有警告,但在MacOS上却完全崩溃了?

另外,与枚举类之间的区别是什么?我的理解是枚举类通常是更好的实践,但我不明白什么时候你想使用其中一个而不是另一个。

为了支持范围枚举(enum class),您必须使用-std=c++11(或更高版本:c++14/c++17/c++20)编译,因为c++ 11引入了它们。这是第一个警告告诉你的。c++ 11之前的声明格式不正确,这就是为什么会出现以下错误。这不是特定于嵌套在另一个类中的enum class

除了相当旧的版本,GCC默认为-std=c++14-std=c++17,这就是为什么你不会在Linux上看到错误或警告。Apple clang(这是c++在Mac上的别名)默认为-std=c++98,这就是为什么你必须手动启用c++ 11或更高版本。(在非过时版本中,上游clang也默认使用最新的标准版本。)

在c++ 11或更高的模式下,你的代码没有任何问题。

选择enum class而不是普通的enum的原因可以在以下问题中找到:为什么enum类优于普通的enum?

最新更新