2014-01-12 34 views
1

(的Visual Studio 2012下)爲什麼有可能得到這個枚舉成員的值,而不必先鑽入嵌套枚舉?

考慮下面的類:

class pe_exception : public std::runtime_error 
{ 
public: 
    //Exception IDs 
    enum exception_id 
    { 
     unknown_error, 
     bad_pe_file, 
     bad_dos_header, 
     image_nt_headers_not_found, 
     error_reading_image_nt_headers, 
     error_reading_data_directories, 
     error_reading_file, 
     pe_signature_incorrect, 
... 

你能告訴爲什麼它可以直接跟這樣的代碼枚舉成員:

bool b = e.get_id() == pe_exception::error_reading_image_nt_headers; 

代替必須先進入枚​​舉?

bool b = e.get_id() == pe_exception::exception_id::error_reading_image_nt_headers; 

(圖書館,這是摘自:https://code.google.com/p/portable-executable-library/

回答

3

也就是說現在的樣子老派枚舉工作:他們有沒有範圍。這直接來自C.

例如:

enum Colour { red, black, orange }; 
Colour c = orange; // OK 

enum Fruit { banana, apple, orange }; // ERROR: orange has already been defined 

C++ 11類枚舉或作用域枚舉解決這個(參見scoped enumerations here獲得更多信息)。

enum class Colour { red, black, orange }; 
Colour c = orange;  // ERROR 
Colour c = Color::red; // OK 

enum class Fruit { banana, apple, orange }; // OK 
0

枚舉是是絕對等同於靜態int類型聲明的列表,除了編譯器生成的初始化值從0開始,並通過將各值之間的一個遞增。

在你的情況

enum exception_id 
{ 
    unknown_error, 
    bad_pe_file, 
    bad_dos_header 
}; 
int val = exception_id::unknown_error; //Not ok (except >MSVC 2010) 

注意,視覺自2010年以來VS(也許之前),你可以添加嵌套的範圍更精確,但這不是標準(而不是編譯的GCC和鐺) 。

等同於:

static int unknown_error = 0; 
static int bad_pe_file= 1; 
static int bad_dos_header= 2; 

的解決方案之前,C++ 11

struct exception_id{ 
enum exception_id_enum 
{ 
    unknown_error, 
    bad_pe_file, 
    bad_dos_header 
};}; 

int val = exception_id::unknown_error; //ok 

現在你可以寫

​​

最後,但很重要的一點打字的變化,現在你有很強的打字。 我讓你讀的bjarne

的常見問題在這裏看到一個很好的交代上MSDN