2015-01-11 8 views
6

यह कोड संकलित क्यों नहीं करता है, और इसे संकलित करने के लिए मैं क्या कर सकता हूं?सी ++ 11 मिश्रण एनम वर्ग और स्विच केस में हस्ताक्षरित 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: 

, जीसीसी और बजना में निर्माण करने के लिए विफल MSVC 2013 में काम करता है

+3

'static_cast (2)' – Borgleader

+7

जोरदार टाइप किया enums दृढ़ता से लिखे जाते हैं, और एक अभिन्न प्रकार के लिए कोई अंतर्निहित रूपांतरण हैं। –

+0

मैंने सोचा ": हस्ताक्षरित int" यह अनुमति है? – paulm

उत्तर

12

enum class का पूरा उद्देश्य इतना है कि उसके सदस्यों सका था इसकी तुलना सीधे int एस से की जा सकती है, जो सी ++ 03 के सापेक्ष सी ++ 11 की प्रकार की सुरक्षा में सुधार कर रही है। enum class से class निकालें और यह संकलित होगा।

प्रभु Bjarne के शब्दों में:

(एक) enum class (एक scoped गणन) एक enum वह जगह है जहाँ प्रगणक गणना के दायरे के भीतर कर रहे हैं और अन्य प्रकार की कोई अंतर्निहित रूपांतरण प्रदान की जाती हैं।

+3

मुझे डर है कि आप' पूरे उद्देश्य 'के बारे में अतिरंजित हैं। एन्युमेटर्स को नेस्टेड नेमस्पेस तक सीमित करने के लिए 'एनम क्लास' का उपयोग करने का एक और कारण है। – 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; 
    } 
} 
संबंधित मुद्दे