2015-01-11 8 views
6

Warum kompiliert dieser Code nicht, und was kann ich tun, damit es kompilieren?C++ 11 Mischen enum-Klasse und unsigned int in Switch-Fall wird nicht kompilieren

#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: 

schlägt in GCC und Clang zu bauen, arbeitet in MSVC 2013

+3

'static_cast (2)' – Borgleader

+7

stark typisierte Aufzählungen stark typisiert sind, und haben keine impliziten Konvertierungen zu einem integralen Typ. –

+0

Ich dachte: "unsigned int" erlaubt das? – paulm

Antwort

12

Der ganze Zweck des enum class war so, dass seine Mitglieder couldn nicht direkt mit int s verglichen werden, angeblich die Typsicherheit von C++ 11 gegenüber C++ 03 verbessernd. Entfernen Sie class von enum class und das wird kompiliert.

Um Herrn Bjarne zu zitieren:

(An) enum class (a scoped Aufzählung) ist ein enum wo die Enumeratoren im Rahmen der Aufzählung und keine impliziten Konvertierungen auf andere Arten vorgesehen sind.

+3

Ich wage zu behaupten, Sie übertrieben über "den ganzen Zweck". Es gibt noch einen anderen Grund, die 'enum class' zu verwenden - um Enumeratoren auf einen geschachtelten Namespace zu beschränken. – ach

2

Eine Alternative, die ein neues Feld hinzuzufügen, indem enum class hält, ist, die einen Wert von 2 bis myEnum darstellt. Dann können Sie unsigned int v zu myEnum v ändern.

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

Sie können einfach eine solche Syntax:

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