嵌套在类中的枚举类可以在 Linux 上编译,但不能在 MacOS 上编译?

enum class nested in a class compiles on Linux, but not MacOS?

提问人:zalanshah64 提问时间:6/29/2022 更新时间:6/29/2022 访问量:287

问:

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

#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 上完全中断?

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

C 编译器错误 G++ 枚举类

评论


答:

0赞 user17732522 6/29/2022 #1

为了支持作用域枚举 (),必须使用 (或更高: //) 进行编译,因为 C++11 引入了它们。这是第一个警告告诉你的。声明在 C++11 之前格式不正确,这就是您随后收到以下错误的原因。这并不特定于嵌套在另一个类中。enum class-std=c++11c++14c++17c++20enum class

除了相当旧的版本外,GCC 默认为 or ,这就是为什么您在 Linux 上看不到错误或警告的原因。Apple clang(这是 g++ 在 Mac 上实际上是一个误导性的别名)默认为 ,这就是为什么您必须手动启用 C++11 或更高版本的原因。(上游 clang 在非过时版本中也默认为更新的标准修订版。-std=c++14-std=c++17-std=c++98

在 C++11 或更高版本模式下,您的代码没有任何问题。

偏爱普通枚举的原因可以在问题中找到,例如,为什么枚举类优先于普通枚举?enum classenum