2012-11-20 25 views
6

मैं सी में एक एसटीएल नक्शा ++ जहां कुंजी एक अहस्ताक्षरित int है में वर्ग डालने, और मूल्य एक वर्ग जिसका निर्माता है:त्रुटि 'कॉल के लिए कोई मिलती-जुलती समारोह' जब एक एसटीएल नक्शा

Foo::Foo(unsigned int integerValue){ 
    //Some stuff 
} 

अन्य वर्ग में मैं शीर्ष लेख में std :: नक्शा declarated है फू की

private: 
    std::map<unsigned int, Foo> *m_mapFoo; 

और सीपीपी फ़ाइल पर मैं इसे बनाया है और डाला उदाहरणों:

m_mapFoo = new std::map<unsigned int, Foo>; 
m_mapFoo->insert(0, new Foo(0)); 
m_mapFoo->insert(1, new Foo(1)); 

लेकिन मैं डालने के तरीकों पर निम्न त्रुटि हो रही है:

no matching function for call to ‘std::map<unsigned int, Foo, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, Foo> > >::insert(const unsigned int&, Foo*)’ 

खोज विधि में इसी प्रकार के समस्या:

m_mapFoo.find(0)->second->someFunctionIntoFooClass(); 

कहाँ त्रुटि वास्तव में निम्नलिखित है:

request for member ‘find’ in ‘((Foo*)this)->Foo::m_mapGeoDataProcess’, which is of non-class type ‘std::map<unsigned int, Foo, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, Foo> > >*’ 

अतिरिक्त नोट्स: मेरे पास एक फू कॉपी कन्स्ट्रक्टर नहीं है, लेकिन मुझे नहीं लगता कि यह समस्या है।

इस त्रुटि को समझने में कोई मदद?

+0

कैसे आप अगर आप एक प्रति निर्माता की जरूरत नहीं है, नक्शे में नकल करने की उम्मीद करते हैं? – Pubby

+0

मैंने स्टैक ओवरफ्लो के आसपास पढ़ा है और कुछ लोग कहते हैं कि आपके पास होना चाहिए, कुछ कहते हैं कि आपको इसकी आवश्यकता नहीं है। लेकिन मुझे नहीं पता कि यह केवल [] सम्मिलन के लिए लागू है और विधि सम्मिलित नहीं है। Http://stackoverflow.com/questions/1478330/c-stl-map-with-a-custom-class-as-second-type –

+0

देखें 'आपको 'insert' के लिए प्रतिलिपि बनाने की आवश्यकता है। 'emplace' की आवश्यकता नहीं है, यद्यपि। – Pubby

उत्तर

6

आप Foo मूल्यों

std::map<unsigned int, Foo> *m_mapFoo; 

और आप कर रहे हैं जिसमें एक नक्शा करने के लिए एक सूचक है यह इलाज के रूप में अगर यह Foo सूचक मान हों:

std::map<unsigned int, Foo*> *m_mapFoo; 

इस प्रयास करें:

m_mapFoo = new std::map<unsigned int, Foo>; 
m_mapFoo->insert(std::make_pair(0, Foo(0))); 
m_mapFoo->insert(std::make_pair(1, Foo(1))); 

दूसरा त्रुटि के लिए के रूप में, आप एक नक्शा करने के लिए एक सूचक है, तो आप

std::map<unsigned int, Foo>::iterator it = m_mapFoo->find(0); 
if (it) { 
    it->second.someFunctionIntoFooClass(); 
} else { 
    // entry not found 
} 
+0

बनी हुई है, धन्यवाद, धन्यवाद! लेकिन अभी भी विधि खोजने में दूसरी त्रुटि है। कोई उपाय? –

+0

@RomanRdgz मैंने दूसरी त्रुटि के बारे में कुछ जोड़ा। सावधान रहें कि आपको 'std :: map :: find' के परिणाम की जांच करनी चाहिए। – juanchopanza

+0

त्रुटि बनी हुई है, वही: सदस्य ढूंढने का अनुरोध ... मैंने भी एक ही परिणाम के साथ शामिल किया है (मैं भूल गया था) –

3

आपका मानचित्र वस्तुओं प्रकार Foo की वस्तुओं के प्रकार Foo की, नहीं संकेत स्टोर करने के लिए लिखा गया हो। देखकर आप new साथ तत्वों आरंभ और -> के माध्यम से अपने सदस्यों का उपयोग करने की कोशिश कर रहे हैं के रूप में, तो आप शायद चाहते हैं:

private: 
    std::map<unsigned int, Foo*> *m_mapFoo; 
+0

मैंने पहले ही इसके बारे में सोचा है, लेकिन समस्या –

0

जरूरत कम जानकारी आप दे से, यह संभावना नहीं लगता है कि आप संकेत उपयोग करने की आवश्यकता कहीं भी :

हेडर में:

private: 
    std::map<unsigned int, Foo> m_mapFoo; 

और वें पर यह प्रयास करें ई cpp फ़ाइल:

m_mapFoo[0] = Foo(0); 
m_mapFoo[1] = Foo(1); 

operator[] के शब्दों .insert() की तुलना में थोड़ा अलग हैं। अगर आपको .insert() की आवश्यकता है, तो इसका इस्तेमाल करें। लेकिन जब तक आप सूक्ष्म अंतर पर भरोसा नहीं कर रहे हैं, तो अधिक पढ़ने योग्य operator[] का उपयोग करें।

खोज विधि पर

इसी तरह, अभिव्यक्ति यदि आप संकेत से बचने और का उपयोग और अधिक पठनीय बन जाता है operator[]:

m_mapFoo[0].someFunctionIntoFooClass();