2012-05-02 5 views
13

क्या अलग-अलग प्रकार में समान enum मान का पुन: उपयोग करने का कोई तरीका है? मैं निम्नलिखित की तरह कुछ करने में सक्षम होना चाहते हैं:अलग enum प्रकारों में enum मानों का पुन: उपयोग

enum DeviceState { UNKNOWN, ACTIVE, DISABLED, NOTPRESENT, UNPLUGGED }; 
enum DeviceType { UNKNOWN, PLAYBACK, RECORDING }; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    DeviceState deviceState = DeviceState::UNKNOWN; 
    DeviceType deviceType = DeviceType::UNKNOWN; 
    return 0; 
} 

यह मेरे लिए समझ में आता है, लेकिन सी ++ compiler- के लिए नहीं यह शिकायत: error C2365: 'UNKNOWN' : redefinition; previous definition was 'enumerator' ऊपर की लाइन 2 पर। क्या ऐसा करने का कोई सही तरीका है, या क्या मुझे हमेशा अद्वितीय enum मानों का उपयोग करना चाहिए? मैं कल्पना नहीं कर सकता कि यह गारंटी देना हमेशा संभव है कि क्या मैं किसी और के कोड को शामिल कर रहा हूं।

उत्तर

15

आप कर सकते हैं और चाहिए, अपने enums एक namespace में शामिल हैं:

namespace DeviceState 
{ 
    enum DeviceState{ UNKNOWN, ACTIVE, DISABLED, NOTPRESENT, UNPLUGGED }; 
} 
namespace DeviceType 
{ 
    enum DeviceType{ UNKNOWN, PLAYBACK, RECORDING }; 
} 

//... 

DeviceType::DeviceType x = DeviceType::UNKNOWN; 
+0

धन्यवाद लुचियन। कृपया आप मेरे लिए अपना उदाहरण सही कर सकते हैं। मुझे यकीन नहीं है कि ऊपर वर्णित अनुसार नामस्थानों का उपयोग करके एक चर घोषित करना है। –

+0

@IAmAI तो मैंने जो कोड पोस्ट किया है वह काम नहीं करता है? –

+0

यदि मैं एक चर को 'डिवाइसस्टेट डिवाइसस्टेट = डिवाइसस्टेट :: UNKNOWN' के रूप में घोषित करता हूं, तो मुझे एक कंपाइलर त्रुटि मिलती है: '' डिवाइसस्टेट ': अभिव्यक्ति में नामस्थान पहचानकर्ता का अवैध उपयोग' –

20

सी ++ 11 का उपयोग करने वालों के लिए, आप का उपयोग करना पसंद कर सकते हैं:

enum class Foo 
बस के बजाय

:

enum Foo 

यह नामस्थानों के समान वाक्यविन्यास और लाभ प्रदान करता है। आपके मामले में, वाक्य रचना होगा:

enum class DeviceState { UNKNOWN, ACTIVE, DISABLED, NOTPRESENT, UNPLUGGED }; 
DeviceState deviceState = DeviceState::UNKNOWN; 

ध्यान दें कि यह दृढ़ता से टाइप किया है, ताकि आप उन्हें मैन्युअल रूप से ints (या कुछ और) को कास्ट करने के लिए की आवश्यकता होगी।