2013-02-19 42 views
9

Tôi có một lớp enum như thế này:Enum Class "không thể chuyển đổi sang unsigned 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 
    }; 

Và tôi đang cố gắng sử dụng các thành viên của enum trong một tuyên bố chuyển đổi như thế này:

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"; 
} 

Tại sao dàn diễn viên là (unsigned int) được yêu cầu khi loại cơ bản đã là unsigned int?

+0

nếu bạn chuyển loại "đúng" để hoạt động (BinaryInstructions), không phải là loại nằm bên dưới (binary_instructions_t) thì bạn sẽ không cần truyền. –

Trả lời

12

Đó là bởi vì "lớp enum" được "gõ mạnh", vì vậy không chuyển đổi hoàn toàn sang bất kỳ loại nào khác. http://en.wikipedia.org/wiki/C%2B%2B11#Strongly_typed_enumerations

+0

Hoàn hảo, cảm ơn, nhưng liệu thời gian thực hiện chậm? (Như một vấn đề quan tâm.) – user3728501

+0

Không, đó là một kiểm tra thời gian biên dịch. –

+0

Nó sẽ không phải vì đó chỉ là thông tin cho trình biên dịch - không có gì phải được thực hiện trong thời gian chạy với chuyển đổi như vậy (trừ khi bạn chỉ định toán tử chuyển đổi thực sự thực hiện điều gì đó yêu cầu tính toán). –

10

Vì C++ 11 strongly typed enums không chuyển đổi hoàn toàn thành các loại tích phân theo thiết kế. Thực tế là loại cơ bản là unsigned int không có nghĩa là loại enum là unsigned int. Đó là BinaryInstructions.

Nhưng bạn không thực sự cần chuyển đổi nào Kể từ arg là một int unsigned, bạn cần một diễn viên, nhưng bạn nên thích một static_cast cho rõ ràng:

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

Hoàn hảo, cảm ơn, nhưng thời gian thực hiện chậm này có được không? (Như một vấn đề quan tâm.) – user3728501

+1

Liệu thời gian thực hiện chậm? Và so với cái gì? –

+0

Sử dụng GCC 4.7.2, tôi nhận được một lỗi biên dịch mà không cần ... – user3728501

Các vấn đề liên quan