2011-03-04 119 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 
} 
相關問題