2013-02-19 60 views
9

我有一個枚舉類是這樣的:枚舉類「不能轉換爲無符號整型」

typedef unsigned int binary_instructions_t; 

    enum class BinaryInstructions : binary_instructions_t 
    { 
     END_INSTRUCTION = 0x0, 

     RESET, 

     SET_STEP_TIME, 
     SET_STOP_TIME, 
     START, 

     ADD 
    }; 

,我試圖用枚舉的成員在這樣的switch語句:

const std::string& function(binary_instructions_t arg, bool& error_detect) 
{ 
    switch(arg) 
    { 
     case (unsigned int)BinaryInstructions::END_INSTRUCTION: 
      return "end"; 
     break; 
    } 
    translate_error = true; 
    return "ERROR"; 
} 

爲什麼當底層類型已經是unsigned int時,需要轉換爲(unsigned int)

+0

如果您將「右」類型傳遞給函數(BinaryInstructions),而不是底層(binary_instructions_t),那麼您將不需要轉換。 – 2013-02-19 21:55:00

回答

12

這是因爲「枚舉類」是「強類型」,因此不能隱式轉換爲任何其他類型。 http://en.wikipedia.org/wiki/C%2B%2B11#Strongly_typed_enumerations

+0

完美,謝謝,但這會減慢執行時間嗎? (作爲感興趣的事情。) – user3728501 2013-02-19 21:49:05

+0

不,這是編譯時檢查。 – 2013-02-19 21:51:18

+0

它不會像編譯器的信息那樣 - 在運行時沒有任何事情需要這樣的轉換(除非你指定了一個實際需要計算的轉換運算符)。 – 2013-02-19 21:51:20

10

因爲C++ 11 strongly typed enums不能通過設計隱式轉換爲整型。基礎類型爲unsigned int的事實並不意味着枚舉的類型是unsigned int。它是BinaryInstructions

但你實際上並不需要轉換反正 由於arg是一個unsigned int,你需要打石膏,但你應該更喜歡清晰度static_cast

switch(arg) 
{ 
    case static_cast<unsigned int>(BinaryInstructions::END_INSTRUCTION) : 
     return "end"; 
    break; 
} 
+0

完美,謝謝,但這會減慢執行時間嗎? (作爲利益的問題。) – user3728501 2013-02-19 21:48:25

+1

執行時間會慢嗎?和什麼相比? – 2013-02-19 21:49:42

+0

使用GCC 4.7.2,我得到一個編譯錯誤,沒有投... – user3728501 2013-02-19 21:50:56