提问人:zalanshah64 提问时间:6/29/2022 更新时间:6/29/2022 访问量:287
嵌套在类中的枚举类可以在 Linux 上编译,但不能在 MacOS 上编译?
enum class nested in a class compiles on Linux, but not 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 上完全中断?
此外,枚举类之间有什么区别?我的理解是,枚举类通常是更好的实践,但我不明白你什么时候想使用一个而不是另一个。
答:
0赞
user17732522
6/29/2022
#1
为了支持作用域枚举 (),必须使用 (或更高: //) 进行编译,因为 C++11 引入了它们。这是第一个警告告诉你的。声明在 C++11 之前格式不正确,这就是您随后收到以下错误的原因。这并不特定于嵌套在另一个类中。enum class
-std=c++11
c++14
c++17
c++20
enum class
除了相当旧的版本外,GCC 默认为 or ,这就是为什么您在 Linux 上看不到错误或警告的原因。Apple clang(这是 g++ 在 Mac 上实际上是一个误导性的别名)默认为 ,这就是为什么您必须手动启用 C++11 或更高版本的原因。(上游 clang 在非过时版本中也默认为更新的标准修订版。-std=c++14
-std=c++17
-std=c++98
在 C++11 或更高版本模式下,您的代码没有任何问题。
偏爱普通枚举的原因可以在问题中找到,例如,为什么枚举类优先于普通枚举?enum class
enum
评论