2013-02-19 2 views
9

У меня есть класс перечисление, как это:Enum Класс «не удалось преобразовать в беззнаковое Int»

typedef unsigned int binary_instructions_t; 

    enum class BinaryInstructions : binary_instructions_t 
    { 
     END_INSTRUCTION = 0x0, 

     RESET, 

     SET_STEP_TIME, 
     SET_STOP_TIME, 
     START, 

     ADD 
    }; 

И я пытаюсь использовать члены перечисления в распределительном заявление, как это:

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), вам не понадобится приведение. –

ответ

12

Это потому, что «класс перечисление» является «строго типизированным», поэтому неявно конвертируется в любой другой тип. http://en.wikipedia.org/wiki/C%2B%2B11#Strongly_typed_enumerations

+0

Отлично, спасибо, но будет ли это медленное время выполнения? (В качестве интереса.) – user3728501

+0

Нет, это проверка времени компиляции. –

+0

Это не так, как это просто информация для компилятора: во время выполнения с таким преобразованием нечего делать (если вы не указали оператор преобразования, который фактически выполняет то, что требует вычисления). –

10

Поскольку C++ 11 strongly typed enums неявно конвертируются в интегральные типы по дизайну. Тот факт, что базовый тип является unsigned int, не означает, что тип перечисления равен unsigned int. Это BinaryInstructions.

Но вы на самом деле не нужно преобразование в любом случае Поскольку arg является неподписанных INT, вам нужен бросок, но вы должны предпочесть static_cast для ясности:

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

Отлично, спасибо, но будет ли это медленное время выполнения? (В качестве интереса.) – user3728501

+1

Какое медленное время исполнения? И по сравнению с чем? –

+0

Использование GCC 4.7.2, я получаю ошибку компиляции без литья ... – user3728501