2014-11-20 11 views
5

के साथ ओवरलोडिंग [] ऑपरेटर की समस्याएं मुझे C++ में टेम्पलेट क्लास के साथ सबस्क्रिप्ट ऑपरेटर को ओवरलोड करने में समस्याएं आ रही हैं। मेरे पास कस्टम मैप क्लास कार्यान्वयन है और मुझे कुंजी के माध्यम से तत्वों तक पहुंचने में सक्षम होना चाहिए।एक टेम्पलेट वर्ग

template <typename K, typename DT> 
DT& myMap<K, DT>::operator[](K key) 
{ 
    for (int i = 0; i<size; i++) 
{ 
    if (elements[i].key == key){ 
     return elements[i].data; 
    } 
} 
} 

कैसे मैं इस समय ऑपरेटर को ओवरलोड कोशिश कर रहा हूँ है। संकलक डेटा की खोज के लिए के कुंजी स्वीकार नहीं करता है। कुंजी कुंजी के लिए डेटा प्रकार है। यह एक अलग वर्ग में संग्रहीत है कि myMap क्लास एक सरणी में है।

तो अगर मुख्य में मैं करने की कोशिश:

myMap<string, int> * test = new myMap < string, int > ; 
test["car"] = 50; 

इसे कहते हैं:

Error expression must have an integral or unscoped enum type 

मैं काफी यकीन है कि समस्या क्या है नहीं कर रहा हूँ।

+4

क्यों बस का उपयोग नहीं 'myMap परीक्षण; 'और फिर' परीक्षण ["कार"] 'अपेक्षित के रूप में काम करेगा। –

+1

समस्या यह है कि आप 'नई' अनावश्यक रूप से उपयोग कर रहे हैं, जो एक बुरी आदत है जिसे सी ++ में टालना चाहिए। यह जावा या सी # नहीं है। –

उत्तर

5

testMyMap पर एक पॉइंटर है, इसकी कोई वस्तु नहीं है, इसलिए test["car"] अंतर्निहित ड्रेरेंस ऑपरेटर को कॉल कर रहा है, न कि आपके अधिभार।

आपको इसे काम करने के लिए (*test)["car"] या test->operator[]("car") की आवश्यकता है।

+0

आपके त्वरित उत्तर के लिए धन्यवाद। हाँ, इसे हल किया। –

+0

नहीं यह सबसे अच्छा जवाब नहीं है। हां, यह कोड काम करता है, लेकिन "समस्या" को ठीक नहीं करता है! समस्या यह नहीं है कि कोड संकलित नहीं होता है, लेकिन ओपी अनावश्यक रूप से एक सूचक और ढेर आवंटन का उपयोग किया जाता है! –

+0

@FabioFracas हाँ, जो मेरा जवाब बेकार बनाता है। डाउनवोट के लिए धन्यवाद। – jrok

0

आपकी गलती यह है कि आप ऑब्जेक्ट के बजाय MyMap पर पॉइंटर का उपयोग करते हैं।

myMap<string, int> * test = new myMap < string, int > ; 
(*test)["car"] = 50 // works but is not idiomatic C++ 
// ... 
delete test; // don't forget! 

के बजाय आप

auto test = myMap<string, int>{}; 
// or: myMap<string, int> test = myMap<string, int>{}; 
test["car"] = 50 

का उपयोग करना चाहिए क्या तुम सच में संकेत का उपयोग करने की जरूरत है, आप कम से कम स्मार्ट संकेत का उपयोग करना चाहिए:

auto test_ptr = std::make_unique<myMap<string, int>>(); 
// or: std::unique_ptr<myMap<string, int>> test_ptr = std::make_unique<myMap<string, int>>(); 
(*test)["car"] = 50; 
संबंधित मुद्दे