2015-01-11 4 views
6

Почему этот код не компилируется и что я могу сделать для его компиляции?C++ 11 класс перезаписи enum и unsigned int в случае коммутатора не будет компилироваться

#include <iostream> 
using namespace std; 

enum class myEnum : unsigned int 
{ 
    bar = 3 
}; 

int main() { 
    // your code goes here 

    unsigned int v = 2; 
    switch(v) 
    { 
     case 2: 
     break; 

     case myEnum::bar: 
     break; 
    } 

    return 0; 
} 

ideone:

https://ideone.com/jTnVGq

prog.cpp: In function 'int main()': 
prog.cpp:18:16: error: could not convert 'bar' from 'myEnum' to 'unsigned int' 
    case myEnum::bar: 

Не удается построить в GCC и Clang, работает в MSVC 2013.

+3

'static_cast (2)' – Borgleader

+7

строго типизированных перечислений являются строго типизированными и не имеют неявные преобразования к целому типу. –

+0

Я думал, что «: unsigned int» разрешил это? – paulm

ответ

12

Вся цель enum class было так, что ее члены не мог сравниваться непосредственно с int с, якобы улучшая безопасность типов C++ 11 по сравнению с C++ 03. Удалите class от enum class, и это скомпилируется.

Процитируем Лорд Бьярн:

(Ап) enum class (а область видимости перечисление) является enum где нумераторы находятся в пределах объема перечисления и никакие неявные преобразования в другие типы не предусмотрены.

+3

Я полагаю, вы преувеличены в отношении цели. Существует еще одна причина использовать «enum class» - для ограничения перечислений на вложенное пространство имен. – ach

2

В качестве альтернативы, которая продолжает использовать enum class, чтобы добавить новое поле, которое представляет собой значение от 2 до myEnum. Затем вы можете изменить unsigned int v на myEnum v.

enum class myEnum : unsigned int 
{ 
    foo = 2, 
    bar = 3 
}; 

int main() { 
    myEnum v = myEnum::foo; 
    switch(v) 
    { 
     case myEnum::foo: 
     break; 

     case myEnum::bar: 
     break; 
    } 
} 
4

Вы можете просто использовать такой синтаксис:

enum class Test { foo = 1, bar = 2 }; 
int main() 
{ 
    int k = 1; 
    switch (static_cast<Test>(k)) { 
    case Test::foo: /*action here*/ break; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^