2009-05-25 12 views
23

मैं std :: मानचित्र के लिए एक कुंजी के रूप में एक कस्टम प्रकार असाइन करने का प्रयास कर रहा हूं। यहां वह प्रकार है जिसे मैं कुंजी के रूप में उपयोग कर रहा हूं।मानचित्र के लिए कुंजी के रूप में कस्टम प्रकार - सी ++

struct Foo 
{ 
    Foo(std::string s) : foo_value(s){} 

    bool operator<(const Foo& foo1) { return foo_value < foo1.foo_value; } 

    bool operator>(const Foo& foo1) { return foo_value > foo1.foo_value; } 

    std::string foo_value; 
}; 

जब std :: नक्शा, मैं निम्न त्रुटि हो रही है के साथ प्रयोग किया।

error C2678: binary '<' : no operator found which takes a left-hand operand of type 'const Foo' (or there is no acceptable conversion) c:\program files\microsoft visual studio 8\vc\include\functional 143 

यदि मैं नीचे की तरह संरचना बदलता हूं, तो सबकुछ काम करता है।

struct Foo 
{ 
    Foo(std::string s) : foo_value(s) {} 

    friend bool operator<(const Foo& foo,const Foo& foo1) { return foo.foo_value < foo1.foo_value; } 

    friend bool operator>(const Foo& foo,const Foo& foo1) { return foo.foo_value > foo1.foo_value; } 

    std::string foo_value; 
}; 

कुछ भी नहीं दोस्त के रूप में ऑपरेटर भार के बनाने को छोड़कर बदल दिया है। मैं सोच रहा हूं कि मेरा पहला कोड क्यों काम नहीं कर रहा है?

कोई विचार?

उत्तर

32

मुझे तुम्हारी जरूरत है

bool operator<(const Foo& foo1) const; 

नोट const तर्क के बाद, इस बनाने के लिए "अपने" (तुलना में बाएं हाथ की ओर) निरंतर आपत्ति है संदेह है।

कारण केवल एक ही ऑपरेटर की आवश्यकता है कि यह आवश्यक क्रम को लागू करने के लिए पर्याप्त है। अमूर्त प्रश्न का उत्तर देने के लिए "क्या बी से पहले आना है?" यह जानना पर्याप्त है कि बी से कम है या नहीं।

+0

धन्यवाद। वह चाल है। –

+0

क्या आप अधिक जानकारी में जा सकते हैं? आपको ऑपरेटर की आवश्यकता क्यों है <और ऑपरेटर == या ऑपरेटर नहीं? – bobobobo

+14

क्योंकि आप ऑपरेटर से ऑपरेटर> और ऑपरेटर == प्राप्त कर सकते हैं <। '(बी <ए) 'का अर्थ है' (ए> बी) ', इसलिए ऑपरेटर है>। और, '(! (ए <बी) &&! (बी <ए))' का अर्थ है कि बी से कम नहीं है और न ही बी से बड़ा है, इसलिए यह बी के बराबर होना चाहिए। – skrebbel

3

शायद यह कॉन्स सदस्य ऑपरेटर (जो भी सही नाम है) की तलाश में है। यह काम करता है (ध्यान दें स्थिरांक):

bool operator<(const Foo& foo1) const { return foo_value < foo1.foo_value;} 

संपादित करें: मेरा उत्तर से operator> नष्ट कर दिया के रूप में यह (सवाल से कॉपी/पेस्ट) की जरूरत नहीं किया गया था, लेकिन यह टिप्पणी :)

नोट खींचने लगीं: मैं 100% सुनिश्चित करें कि आपको const की आवश्यकता है क्योंकि मैंने उदाहरण संकलित किया है।

+2

आपको इसकी आवश्यकता नहीं है> –

+0

मजेदार स्टैकओवरफ्लो 10 मिनट पहले पिछले उत्तर दिखाता है लेकिन जब मैं अपना उत्तर सबमिट करता हूं तब तक कोई नहीं था ... इसलिए वही उत्तर – stefanB

+0

ऑब्जेक्ट निरंतर कॉन्स फ़ंक्शन की आवश्यकता होगी। – siddhusingh

0

तर्कों के बाद कॉन्स को नोट करें, यह "आपका" (तुलना में बायीं तरफ) ऑब्जेक्ट निरंतर बनाने के लिए है।

क्या आप इस पर विस्तृत जानकारी दे सकते हैं? यदि आप सदस्य का गठन करते हैं (जहां तक ​​मुझे पता है कि यह ऑब्जेक्ट की स्थिति को बदल नहीं सकता है - उदाहरण के लिए निजी चर संशोधित करें) गारंटी देता है कि "आपका" बाएं हाथ की तरफ होगा?

0

क्या आप इस पर विस्तृत जानकारी दे सकते हैं? यदि आप सदस्य का गठन करते हैं (जहां तक ​​मुझे पता है कि यह ऑब्जेक्ट की स्थिति को बदल नहीं सकता है - उदाहरण के लिए निजी चर संशोधित करें) गारंटी देता है कि "आपका" बाएं हाथ की तरफ होगा?

मेरे पास अभी तक इस पर टिप्पणी करने का प्रतिनिधि नहीं है।

कॉन्स जादूई रूप से यह सुनिश्चित नहीं करता है कि "आपका" बाएं हाथ की ओर होगा। पोस्टर कह रहा था कि बायीं तरफ (यानी x < वाई में x) वह वस्तु है जिस पर तुलना की जा रही है। जैसे ही आप वाई के सदस्यों को ऑपरेटर < पर तर्क पर कॉन्स्ट के साथ परिवर्तन से बचाने की रक्षा करते हैं, आप भी विधि हस्ताक्षर के अंत में एक्स के सदस्यों को कॉन्स्ट के साथ बदलने से बचाने के लिए चाहते हैं।