嵌套在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?
此外,是枚举类之间的差异?我的理解是,枚举课程通常是更好的练习,但是我不明白您何时想使用另一个。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
为了支持范围的枚举(
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 theenum 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 plainenum
can be found e.g. in the question Why is enum class preferred over plain enum?.