2011-10-23 17 views
9
#include <iostream> 
#include <vector> 
#include <algorithm> 
class MyData 
    { 
    public: 
     int m_iData; 
     bool operator<(MyData rhs) { return m_iData < rhs.m_iData; } 
    }; 

int main() 
{ 
    std:: vector <MyData> myvector(2, MyData()); 
    myvector[0].m_iData=2; myvector[1].m_iData=4; 

    std::sort(myvector.begin(), myvector.end()); 
} 

इस देता संकलित करने के लिए प्रयास कर रहा है:त्रुटि: गुजर 'स्थिरांक टी' के रूप में की 'इस' तर्क 'bool टी :: ऑपरेटर <(टी)' को छोड़ देता है क्वालिफायर

error: passing 'const MyData' as 'this' argument of 'bool MyData::operator<(MyData)' 
discards qualifiers 
+0

शीर्षक में '--' शीर्षक में' --' बदलें। मुझे सवाल समझने में कठिन समय था। (मुझे नहीं पता कि मेरे पास इस प्रश्न पर संपादन बटन क्यों नहीं है, हालांकि ...) – kay

उत्तर

17

तुलना ऑपरेटर को क्लास इंस्टेंस के कॉन्स्ट-रेफरेंस पर कॉल किया जाएगा, इसलिए इसे कॉन्स सदस्य फ़ंक्शन के रूप में घोषित किया जाना चाहिए।

यह भी स्थिरांक-संदर्भ के बजाय मूल्य से तर्क पारित करने के लिए अच्छा अभ्यास है, हालांकि यह अपने सरल वर्ग के लिए बहुत अधिक अंतर नहीं पड़ता है है:

bool operator<(const MyData & rhs) const { return m_iData < rhs.m_iData; } 
//    ^^^^^^^^^^^^^^  ^^^^^ 
//    if you like   mandatory 

यह आम तौर पर अत्यधिक की सिफारिश की है घोषित करें सभी सदस्य फ़ंक्शन निरंतर जो आपके ऑब्जेक्ट को म्यूट नहीं करते हैं। यह न केवल आपके इरादे और डिजाइन को संवाद करता है, बल्कि अन्यथा उन वस्तुओं को निरंतर वस्तुओं या संदर्भों पर उपयोग करने के लिए भी संभव नहीं होगा।

5

एक operator<const होना चाहिए दोनों तर्कों के लिए:

bool operator<(MyData const& rhs) const { return m_iData < rhs.m_iData; } 
+0

यह काम किया, धन्यवाद। संदर्भ में भी अच्छा संकेत। मैंने इसके बारे में सोचा नहीं था। –

0

आपको const ऑपरेंड के साथ एक ऑपरेटर लिखना चाहिए। here देखें।

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