2012-06-27 23 views
6

मैं operator== ओवरलोड कोशिश कर रहा हूँ 'ठीक एक तर्क ले लेना चाहिए, लेकिन संकलक निम्न त्रुटि फेंक है:ओवरलोडिंग ऑपरेटर == की शिकायत

‘bool Rationalnumber::operator==(Rationalnumber, Rationalnumber)’ must take exactly one argument 

मेरे कोड के छोटे से टुकड़े इस प्रकार है:

bool Rationalnumber::operator==(Rationalnumber l, Rationalnumber r) { 
    return l.numerator() * r.denominator() == l.denominator() * r.numerator(); 
} 

घोषणा:

bool operator==(Rationalnumber l, Rationalnumber r); 

किसी को भी किसी भी विचार क्यों यह टी फेंक रहा है है वह त्रुटि?

+1

इससे मदद मिल सकती है: http://stackoverflow.com/questions/4421706/operator-overloading। चूंकि आपका कोई सदस्य है, हालांकि, यह पहले से ही छिपी हुई 'इस' तर्क के माध्यम से बाईं ओर आ रहा है। – chris

+1

आपको एक ar के साथ सदस्य फ़ंक्शन को परिभाषित करना होगा दो तर्कों के साथ स्मारक या फ़ाइल स्कोप फ़ंक्शन। – harper

+0

क्या यह सदस्य फ़ंक्शन या नि: शुल्क स्थायी कार्य है? –

उत्तर

1

आपको अपने ऑपरेटर == को किसी तर्कसंगत संख्या से कहीं और हटा देना चाहिए। जैसा कि इसे कक्षा के भीतर घोषित किया जाता है, यह माना जाता है कि 'यह' पहला तर्क है। अर्थशास्त्र से यह देखा जाता है कि आप एक कंपाइलर को 3 तर्क प्रदान करते हैं।

12

तो operator== एक गैर स्थिर डेटा सदस्य है, है केवल एक पैरामीटर लेना चाहिए, के रूप में तुलना निहित this पैरामीटर के लिए होगा:

class Foo { 
    bool operator==(const Foo& rhs) const { return true;} 
}; 

आप एक नि: शुल्क ऑपरेटर उपयोग करना चाहते हैं (यानी नहीं एक एक वर्ग के सदस्य), तो आप दो तर्क निर्दिष्ट कर सकते हैं:

class Bar { }; 
bool operator==(const Bar& lhs, const Bar& rhs) { return true;} 
2

के रूप में एक सदस्य ऑपरेटर को ओवरलोड यह होना चाहिए केवल एक तर्क लें, दूसरा this है।

class Foo 
{ 
    int a; 

public: 
    bool operator==(const Foo & foo); 
}; 

//... 

bool Foo::operator==(const Foo & foo) 
{ 
    return a == foo.a; 
} 
0
friend bool operator==(Rationalnumber l, Rationalnumber r); 

जब आप गैर सदस्य समारोह के रूप में यह घोषणा तो उसे दो तर्कों ले सकते हैं। जब आप इसे सदस्य फ़ंक्शन के रूप में घोषित करते हैं, तो यह केवल एक तर्क ले सकता है।

0

आप यह घोषणा एक स्थिरांक SpreadSheetCell & ऑपरेटर + हैं (स्थिरांक & एलएचएस SpreadSheetCell, स्थिरांक & आरएचएस SpreadSheetCell); तो पहला तर्क "यह" सूचक के रूप में कार्य करता है। तो, के रूप में "एक त्रुटि फेंक

त्रुटि:। 'स्थिरांक SpreadSheetCell & SpreadSheetCell :: ऑपरेटर + (स्थिरांक SpreadSheetCell &, स्थिरांक SpreadSheetCell &)' रखना चाहिए या तो शून्य या एक तर्क

आप एक करना चाहते हैं। दो तर्क फ़ंक्शन, तो आपको कक्षा के बाहर एक ही फ़ंक्शन घोषित करना होगा और इसका उपयोग करना होगा।

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