2010-05-29 13 views
8

संकलन नहीं करता मानचित्र निम्नलिखित:एसटीएल संदर्भों वाले

std::map<int, ClassA &> test; 

देता है:

error C2101: '&' on constant 

जबकि निम्नलिखित

std::map<ClassA &, int> test; 

देता

error C2528: '_First' : pointer to reference is illegal 

उत्तरार्द्ध लगता है कि मानचित्र में महत्वपूर्ण मान के लिए संदर्भ नहीं हो सकता है, क्योंकि इसे कभी-कभी कक्षा को तुरंत चालू करने की आवश्यकता होती है और किसी ऑब्जेक्ट के बिना किसी संदर्भ को तत्काल नहीं किया जा सकता है। लेकिन पहला मामला क्यों काम नहीं करता है?

उत्तर

16

एक एसटीएल कंटेनर में संदर्भों को स्टोर करना अवैध है, क्योंकि प्रकारों को प्रतिलिपि बनाने योग्य और असाइन करने योग्य होना चाहिए। संदर्भ असाइन नहीं किए जा सकते हैं।

सटीक रूप से कौन सी ऑपरेशन पहली त्रुटि का कार्यान्वयन निर्भर करती है, लेकिन मैं छवि करता हूं कि यह संदर्भ बनाने से संबंधित है और इसे तुरंत निर्दिष्ट नहीं कर रहा है। दूसरा त्रुटि संदेश वास्तव में मैप इंडेक्स बनाने से संबंधित है।

यदि आपका प्रकार छोटा है, तो आप इसे मानचित्र में कॉपी कर सकते हैं, या यदि यह बड़ी संख्या में पॉइंटर्स का उपयोग करने पर विचार कर रहा है, लेकिन याद रखें कि कंटेनर आपके लिए ऑब्जेक्ट्स को डिलीकेट नहीं करेगा, तो आपको यह स्पष्ट रूप से करना होगा ।

This SO प्रश्न आपके लिए ब्याज का हो सकता है।

3

§8.3.2 खंड 5

संदर्भ के लिए संदर्भ के लिए कोई संदर्भ, संदर्भ की कोई सरणियों, और कोई संकेत वहाँ होगा।

आप शायद मजाकिया पॉइंटर्स के रूप में संदर्भों के बारे में सोच रहे हैं। वो नहीं हैं।

1

आप संदर्भों को संग्रहीत नहीं कर सकते क्योंकि वे प्रतिलिपि बनाने योग्य नहीं हैं (और कुछ ऑपरेशन असंभव होंगे क्योंकि वे डिफ़ॉल्ट रूप से रचनात्मक नहीं हैं)।

आप फिर भी एक सूचक का उपयोग कर व्यवहार का अनुकरण कर सकते हैं:

std::map<int, ClassA*> test; 

यह थोड़ा कष्टप्रद है, क्योंकि आप तो दो बार भिन्नता की जरूरत है:

std::map<int, ClassA*>::iterator it = test.begin(); 

it->second->foo(); 

लेकिन एक map साथ इसके साथ की तुलना में कम भ्रामक है vector या set (यह (*it)->foo() होगा।

अंत में

, कुछ gotchas (एक सूचक के उन) देखते हैं:

  • से वस्तु बताया करने के लिए लंबे समय के रूप में जीवित रहेगा आपको सुनिश्चित करना होगा के रूप में आप सूचक
  • के डिफ़ॉल्ट प्रारंभ उपयोग करना चाहते हैं एक सूचक, एक यादृच्छिक मूल्य है यह अनिर्धारित व्यवहार
  • जब सूचक फेंक दी जाती है कारण का उपयोग कर, वस्तु बनी हुई है (शुक्र), लेकिन इसका मतलब यह है कि आप इसे एक बिंदु पर नष्ट हो जाएगा बनाने की जरूरत है