2015-01-11 13 views
6

Tại sao mã này không biên dịch, và những gì tôi có thể làm gì để làm cho nó biên dịch?C + + 11 trộn enum lớp và unsigned int trong trường hợp chuyển đổi sẽ không biên dịch

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

Không để xây dựng trong GCC và Clang, làm việc trong MSVC 2013.

+3

'static_cast (2) ' – Borgleader

+7

mạnh gõ enums được đánh mạnh, và không có chuyển đổi tiềm ẩn đến một loại không thể thiếu. –

+0

Tôi nghĩ ": unsigned int" cho phép điều này? – paulm

Trả lời

12

Toàn bộ mục đích của enum class là để các thành viên của nó couldn Không được so sánh trực tiếp với int s, cải thiện bề ngoài an toàn loại C++ 11 so với C++ 03. Xóa class từ enum class và thao tác này sẽ biên dịch.

Để báo Chúa Bjarne:

(An) enum class (một liệt kê scoped) là một enum nơi điều tra nằm trong phạm vi thuộc kiểu liệt kê và không chuyển đổi tiềm ẩn với các loại khác được cung cấp.

+3

Tôi daresay bạn phóng đại về' toàn bộ mục đích '. Có một lý do khác để sử dụng 'enum class' - để hạn chế các điều tra viên đến một không gian tên lồng nhau. – ach

2

Cách thay thế tiếp tục sử dụng enum class là thêm trường mới đại diện cho giá trị từ 2 đến myEnum. Sau đó, bạn có thể thay đổi unsigned int v thành 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

Bạn chỉ có thể sử dụng cú pháp như:

enum class Test { foo = 1, bar = 2 }; 
int main() 
{ 
    int k = 1; 
    switch (static_cast<Test>(k)) { 
    case Test::foo: /*action here*/ break; 
    } 
} 
Các vấn đề liên quan