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

时间:2011-03-04 01:06:53

标签: c++ enums g++ c++11

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

在MyCode.h中我声明了

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

class MyClass {

MyEnum enumInstance;
void Foo();

}; 

然后在MyCode.cpp中:

#include "MyCode.h"

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

但是当用g ++编译时我得到错误'MyEnum'不是类或命名空间......

(在MS VS2010中工作正常,但不是linux g ++)

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

4 个答案:

答案 0 :(得分:62)

语法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;
 }

答案 1 :(得分:51)

在C ++ 0x之前,Scoped枚举将不存在。目前,您的代码应为

enumInstance = SomethingElse;

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

答案 2 :(得分:31)

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

这是使用gcc版本4.4.5

答案 3 :(得分:2)

在其他答案中解释:语法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
}