嵌套在linux上的嵌套的枚举类,而不是macOS?

发布于 2025-02-11 07:54:46 字数 3209 浏览 2 评论 0 原文

我写了一个基本程序来展示我要处理的问题。

#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?

此外,枚举类之间的差异?我的理解是,枚举课程通常是更好的练习,但是我不明白您何时想使用另一个。

I wrote a basic program to show the issue I'm dealing with.

#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;
}

Basically, there's an enum class that is nested within another class. When I try compiling this on Linux, I have no problem. Compiling this on MacOS throws this at me:

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.

I'm not totally sure what the issue is. Am I not allowed to nest enum classes inside other classes? Why does it compile with no warnings on Linux but completely break in MacOS?

Additionally, what is the difference between an enum class? My understanding is that enum classes are generally better practice, but I don't understand when you'd want to use one over the other.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

水波映月 2025-02-18 07:54:46

为了支持范围的枚举( enum class ),您必须使用 -STD = C ++ 11 (或更高: C ++ 14 / C ++ 17 / C ++ 20 )由于C ++ 11引入了它们。这是第一个警告告诉您的。声明是不形成的pre-c ++ 11,这就是为什么您会遇到以下错误的原因。这不是特定于 enum class 嵌套在另一类中的。

除了非常旧的版本外,GCC默认为 -std = C ++ 14 -STD = C ++ 17 ,这就是为什么您看不到错误或警告Linux。 Apple Clang(G ++确实是Mac上的误导别名)默认为 -STD = C ++ 98 ,这就是为什么您必须手动启用C ++ 11或更高版本的原因。 (上游叮当声还默认为非观察版本中最新的标准修订版。)

在C ++ 11或更高版本中,您的代码没有错。

可以在问题 -Enum-class-preferred-over-plain-enum“>为什么枚举类别优于普通枚举?

In order to have support for scoped enumerations (enum class) you must compile with -std=c++11 (or higher: c++14/c++17/c++20) since C++11 introduced them. This is what the first warning is telling you. The declaration is ill-formed pre-C++11 which is why you then get the following errors. This is not specific to the enum class being nested in another class.

Except for quite old versions, GCC defaults to -std=c++14 or -std=c++17, which is why you don't see an error or warning on Linux. Apple clang (which is what g++ really is a misleading alias for on Mac) defaults to -std=c++98, which is why you must manually enable C++11 or later. (Upstream clang also defaults to a more recent standard revision in non-obsolete versions.)

In C++11 or later mode there is nothing wrong with your code.

The reasons to prefer enum class over plain enum can be found e.g. in the question Why is enum class preferred over plain enum?.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文