2012-01-02 12 views
18

मेरी कक्षा में मैं इस तरह एक enum परिभाषित करने के लिए 'int' से अवैध रूपांतरण का कहना है यह त्रुटि प्राप्त करें:enum का उपयोग कर 'प्रकार'

 
error: invalid conversion from 'int' to 'myClass::AccessType {aka myClass::access}' [-fpermissive] 

फ़ील्ड को पूर्णांक में नक्शा न करें?

+0

संभावित डुप्लिकेट: [सी # में एनम को कास्ट करें] (http: // stackoverflow।com/प्रश्न/29482/डाली-पूर्णांक करने वाली enum-इन-सी तेज) – danihp

उत्तर

16

नहीं, वे पूर्णांक के रूप में जमा हो जाती है, लेकिन वे अलग प्रकार (उदा तुम भी अधिभार enum प्रकार के आधार पर कर सकते हैं) कर रहे हैं। आप स्पष्ट रूप से परिवर्तित करना होगा:

myClass ob; 
ob->aType = (myClass::AccessType)0; 

या कभी बेहतर enum की इसी नाम पर रखा गया मान लिखना:

myClass ob; 
ob->aType = myClass::forL; 

या शायद आप पूर्णांक स्थिरांक का एक सेट के रूप में enum उपयोग करना चाहते हैं, को बदलने फ़ील्ड का प्रकार:

class myClass 
{ 
public: 
    enum { 
     forL, 
     forM, 
     forA 
    }; 
    int aType; // just stores numbers 
}; 

enum से int में रूपांतरण अंतर्निहित है।

+0

वस्तु किसी अन्य फ़ाइल में बनाया जाता है। तो यह 'forL' नहीं पहचानता है। – mahmood

+0

@mahmood: ओह, आप इसे 'myClass ::' के साथ योग्य होना चाहिए। – ybungalobill

+0

मैंने 'ob-> aType = myClass :: access :: forL लिखा;' लेकिन यह कहता है कि 'myClass :: access' एक वर्ग या नामस्थान नहीं है – mahmood

8

गणन सदस्यों पूर्णांक मूल्यों से समर्थन कर रहे हैं लेकिन कोई निहित एक enum प्रकार के एक पूर्णांक से रूपांतरण है। के बाद से पर समय संकलन का कोई तरीका नहीं है कि पता करने के लिए किया जाता है,> enum -

ob->aType = static_cast<myClass::access>(0); 
+0

इस एक पोर्टेबल समाधान (मैं भविष्य में संकलक चेतावनी मतलब) है' ऑटो exampleEnum = static_cast (exampleInt): सही – mahmood

+2

जब तक निर्दिष्ट पूर्णांक enum की मान्य श्रेणी में है, किसी भी मानक अनुरूप संकलक इस प्रति सी ++ कल्पना की 7.2.10 के रूप में की अनुमति चाहिए । मूल्य अगर यह गणना प्रकार की गणना मूल्यों की सीमा में है अपरिवर्तित है;। अन्यथा जिसके परिणामस्वरूप गणन मूल्य अनिर्दिष्ट है " – bobbymcr

2

आप पूर्णांक से एक अंतर्निहित डाली नहीं कर सकते: आप एक स्पष्ट डाली उपयोग करने के लिए यदि आप वास्तव में इसे इस तरह लिखना चाहते हैं की जरूरत है कास्ट मान्य है।

आप निहित अन्य तरीके से डाले, तो आप कर सकते थे (यदि आप चाहते थे) कर कर सकते हैं:

int foo = forL; 
0

मैं सिर्फ एक ही मुद्दा था। मुझे किसी ऑब्जेक्ट को एक XML फ़ाइल में पढ़ने के लिए प्रारंभ करना है और निश्चित रूप से, मेरे पास उस फ़ाइल के साथ क्या हो सकता है पर कोई नियंत्रण नहीं है।

enum status_t { NOT_STARTED, STARTED, DONE }; 
MyObject::MyObject(int id, status_t status) : m_id(id), m_status(status){} 

तो जब Xml मैं इसे कास्ट करने के लिए है पार्स करने:

निर्माता तर्क के रूप में एक enum है। मैंने फिर कन्स्ट्रक्टर में कलाकारों को संभालने के लिए पसंद किया ताकि अन्य वर्गों को यह पता न हो कि वैध मानदंड कौन सा है।

MyObject::MyObject(int id, int status) : m_id(id){ 
    m_status = status_t(status); 
} 

लेकिन कोई रास्ता नहीं यकीन है कि एक्सएमएल से आ रही मूल्य सही रेंज में हो जाएगा किया जाना है।

MyObject::MyObject(int id, int status) : m_id(id){ 
    switch(status){ 
     case NOT_STARTED: 
     case STARTED: 
     case DONE: 
      m_status=status_t(status); 
      break; 
     default: 
      m_status=NOT_STARTED; 
      break; 
    } 
} 

यह एक कार्यान्वयन विकल्प, गैर सुसंगत डेटा के मामले में एक डिफ़ॉल्ट मान के लिए मजबूर करने के लिए है:

यहाँ समाधान मैं के साथ आया है। कोई अपवाद फेंकना पसंद कर सकता है, मेरे मामले में यह इस तरह से करेगा।

संबंधित मुद्दे