जब मैं निम्नलिखित (छ ++ 4.6.3)सी ++ ऑपरेटर अधिभार: ऑब्जेक्ट से संदर्भ में कोई ज्ञात रूपांतरण नहीं?
class A {};
A& operator*=(A& a, const A& b)
{
return a;
}
A operator*(const A& a, const A& b)
{
return A(a) *= b;
}
int main(int, char*[])
{
A a, b;
a = a*b;
return 0;
}
मैं त्रुटि मिलती है संकलन करने की कोशिश
/tmp/test.cxx: In function ‘A operator*(const A&, const A&)’:
/tmp/test.cxx:14:20: error: no match for ‘operator*=’ in ‘(* & a) *= b’
/tmp/test.cxx:14:20: note: candidate is:
/tmp/test.cxx:6:1: note: A& operator*=(A&, const A&)
/tmp/test.cxx:6:1: note: no known conversion for argument 1 from ‘A’ to ‘A&’
यह पहेली मुझे - कैसे कर सकते हैं कि वर्ग के लिए एक संदर्भ के लिए एक वर्ग से एक रूपांतरण ज्ञात नहीं है?
के रूप में इस प्रकार का कोई प्रभाव नहीं होता है वर्ग ए की घोषणा बदलना:
class A
{
public:
A() {}
A(const A&) {}
};
एक ही त्रुटि।
मैं यहां क्या हो रहा है के संकेतों के लिए बहुत आभारी हूं।
ऑपरेटर को कक्षा के दायरे में घोषित करके आप इस समस्या को ठीक कर सकते हैं। फिर आपकी विधि हस्ताक्षर इस तरह दिखेगा: 'ऑपरेटर * (कॉन्स ए और आरएएस) कॉन्स;' यदि आप कार्यान्वयन के लिए कंपाउंड ऑपरेटर का उपयोग करना चाहते हैं तो आप लिख सकते हैं: 'वापसी * यह * = rhs' – Paranaix
@ पाराएक्सएक्स: नहीं, आप 'const' के अंदर '* this' पर 'ऑपरेटर * =' का उपयोग नहीं कर सकते सदस्य समारोह, क्योंकि यह '* यह 'संशोधित करेगा। –
@BenVoigt: हाँ आपका पूरा अधिकार है। मैं इसे एक लाइनर के रूप में लिखना चाहता था और गलती से पूरे जादू को हटा दिया। यह चाल 'इस' से एक प्रतिलिपि बनाना है। उदाहरण में: 'एक ret = * यह; ret * = rhs; वापसी वापस; ' – Paranaix