2011-03-04 116 views
55

您好我有文件名为MyCode.h和MyCode.cpp我的枚举是不是类或命名空间

在MyCode.h我在MyCode.cpp宣布

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

class MyClass { 

MyEnum enumInstance; 
void Foo(); 

}; 

然后:

#include "MyCode.h" 

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

但相克编译时++我得到的错误“MyEnum”不是一个类或命名空间...

(在MS VS2010但不能正常工作linux g ++)

任何想法? 谢谢 Thomas

+1

注:在你的'.cpp'文件,如果你想为'MyClass的:: foo'实施中,签名会'MyClass的无效:: Foo(){...}'。你错过了'MyClass ::'位。 – phooji 2011-03-04 01:12:21

+0

MyCode.h!= MyClass.h ...疑问虽然有帮助:P – dcousens 2011-03-04 01:37:24

回答

57

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

幸运的是,C++ 0x将增加该容量,一个我认为缺乏相当一段时间和迫切需要的容量。 – 2011-03-04 01:36:31

+1

谢谢。这让我疯狂。我无法弄清楚为什么我的枚举可以在一个XCode项目中解决,而不是在另一个XCode项目中解决。 O.o 虽然我仍然没有答案,为什么发生这种情况,我知道修复。如果有人冒险猜测,我会很高兴知道.. – javatarz 2013-07-01 15:28:03

51

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

enumInstance = SomethingElse; 

您可以创建一个人工通过将枚举的定义自己的命名空间或结构的内部范围的枚举。

29

事实上,C++ 0X允许该功能。我可以在GCC使用此命令行标志成功启用:-std =的C++ 0x

这与gcc版本4.4.5

+1

谢谢,帮我节省了时间 – karate 2015-04-17 14:10:14

2

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

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

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

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 
} 
相关问题