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

嗨,我有文件称为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 + +)

有任何想法吗? 谢谢Thomas

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

范围枚举将不存在,直到C ++ 0x。 目前,你的代码应该是

 enumInstance = SomethingElse; 

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

的确,C ++ 0x允许这个特性。 我可以使用这个命令行标志在gcc中成功启用它: -std = c ++ 0x

这是与海湾合作委员会版本4.4.5

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

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

所以用户应该在每个枚举值处引用types名称。 避免两次声明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 }