2015-01-11 13 views
6

Neden bu kod derlenmiyor ve derleme yapmak için ne yapabilirim?C++ 11 enum sınıfı ve imzasız int geçişi durumunda derleme yapılmaz

#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 ve Clang inşa başarısız enum class tüm amacı, üyelerinin edemezdim ki oldu

+3

' (2)' – Borgleader

+7

Kesinlikle enums kesinlikle yazılı ve ayrılmaz bir tipe örtülü hiçbir dönüşüm sahiptir Yazılan static_cast. –

+0

"İmzasız int" diye buna izin verdim? – paulm

cevap

12

MSVC 2013 çalışır C++ 03'e göre C++ 11'in tip güvenliğini gözle görülür şekilde iyileştirmek için doğrudan int s ile karşılaştırılmalıdır. enum class'dan class öğesini kaldırın ve bu işlem derlenecektir.

Rab Bjarne alıntı yapacak olursak: enumerator'ın numaralandırma kapsamı içindedir ve diğer türlerine örtülü hiçbir dönüşüm sağlanmaktadır nerede

(An) enum class (bir kapsamlı numaralandırma) bir enum olduğunu.

+3

Ben' tüm amaç 'hakkında abartılı davrandım. Numaratörleri yuvalanmış bir ad alanına kısıtlamak için enum sınıfını kullanmanın başka bir nedeni vardır. – ach

2

enum classmyEnum için 2 değeri temsil eden yeni bir alan ekleme kullanıldığı tutan bir alternatif. Ardından unsigned int v'u myEnum v olarak değiştirebilirsiniz.

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

Sadece böyle bir sözdizimi kullanabilirsiniz:

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