我的枚举不是类或命名空间

发布于 2024-10-20 18:15:42 字数 443 浏览 1 评论 0原文

您好,我有名为 MyCode.h 和 MyCode.cpp 的文件

声明了

enum MyEnum {Something = 0, SomethingElse = 1};

class MyClass {

MyEnum enumInstance;
void Foo();

}; 

在 MyCode.h 中我已在 MyCode.cpp 中

#include "MyCode.h"

void MyClass::Foo() {
    enumInstance = MyEnum::SomethingElse;
}

Then:但是当使用 g++ 编译时,我收到错误“MyEnum”不是类或命名空间...

(在MS VS2010 但不是 linux g++)

有什么想法吗? 谢谢 托马斯

Hi I have files called MyCode.h and MyCode.cpp

In MyCode.h I have declared

enum MyEnum {Something = 0, SomethingElse = 1};

class MyClass {

MyEnum enumInstance;
void Foo();

}; 

Then in MyCode.cpp:

#include "MyCode.h"

void MyClass::Foo() {
    enumInstance = MyEnum::SomethingElse;
}

but when compiling with g++ I get the error 'MyEnum' is not a class or namespace...

(works fine in MS VS2010 but not linux g++)

Any ideas?
Thanks
Thomas

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

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

发布评论

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

评论(4

终遇你 2024-10-27 18:15:42

语法 MyEnum::SomethingElse 是 Microsoft 扩展。它恰好是我喜欢的一种,但它不是标准 C++。 enum 值被添加到周围的命名空间:

 // header
 enum MyEnum {Something = 0, SomethingElse = 1};

 class MyClass {

 MyEnum enumInstance;
 void Foo();

 }

 // implementation
 #include "MyClass.h"

 void Foo() {
     enumInstance = SomethingElse;
 }

The syntax MyEnum::SomethingElse is a Microsoft extension. It happens to be one I like, but it's not Standard C++. enum values are added to the surrounding namespace:

 // header
 enum MyEnum {Something = 0, SomethingElse = 1};

 class MyClass {

 MyEnum enumInstance;
 void Foo();

 }

 // implementation
 #include "MyClass.h"

 void Foo() {
     enumInstance = SomethingElse;
 }
烟燃烟灭 2024-10-27 18:15:42

作用域枚举直到 C++0x 才会存在。目前,您的代码应该是

enumInstance = SomethingElse;

您可以通过将枚举的定义放入其自己的命名空间或结构中来创建人工范围的枚举。

Scoped enums will not exist until C++0x. For the time being, your code should be

enumInstance = SomethingElse;

You can create an artificial scoped enum by putting the enum's definition inside its own namespace or struct.

指尖上得阳光 2024-10-27 18:15:42

事实上,C++0x 允许该功能。我可以使用以下命令行标志在 gcc 中成功启用它: -std=c++0x

This was with gcc version 4.4.5

Indeed, C++0x allows that feature. I could enable it successfully in gcc using this command line flag: -std=c++0x

This was with gcc version 4.4.5

嘴硬脾气大 2024-10-27 18:15:42

正如其他答案中所解释的:语法 MyEnum::SomethingElse 在常规 C++98 枚举上无效,除非您的编译器通过非标准扩展支持它们。

我个人不喜欢声明 enum MyEnum {A, B}; 因为使用枚举值时不存在类型名称。这可能会导致当前名称空间中的名称冲突。

因此用户应该在每个枚举值处引用类型名称。避免声明 A 两次的示例:

enum MyEnum {MyEnum_A, MyEnum_B};
void A(void) {
    MyEnum enumInstance = MyEnum_A;
}

我更喜欢使用特定的名称空间或结构。
这允许使用最新的 C++ 风格引用枚举值:

namespace MyEnum {
    enum Value {A,B};
}
void A(void) {
    MyEnum::Value enumInstance = MyEnum::A
}

As explain in other answers: syntax MyEnum::SomethingElse is not valid on regular C++98 enums unless your compiler supports them through non-standard extensions.

I personally don't like the declaration enum MyEnum {A, B}; because Type name is not present while using enum values. This can leads to conflict of names in the current name space.

So user should refer to the type name at each enum values. Example to avoid declaring A twice:

enum MyEnum {MyEnum_A, MyEnum_B};
void A(void) {
    MyEnum enumInstance = MyEnum_A;
}

I prefer to use a specific name space or structure.
This allow to reference enum values with latest C++ style:

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