2010-02-25 19 views
6

मैं इस तरह के गैर-मित्र गैर-सदस्य फ़ंक्शन के साथ अल्पविराम ऑपरेटर को अधिभारित करने का प्रयास कर रहा हूं:मेरा अधिभारित अल्पविराम ऑपरेटर क्यों नहीं बुलाया जाता है?

#include <iostream> 
using std::cout; 
using std::endl; 

class comma_op 
{ 
    int val; 

public: 
    void operator,(const float &rhs) 
    { 
     cout << this->val << ", " << rhs << endl; 
    } 
}; 

void operator,(const float &lhs, const comma_op &rhs) 
{ 
    cout << "Reached!\n";  // this gets printed though 
    rhs, lhs;     // reversing this leads to a infinite recursion ;) 
} 

int main() 
{ 
    comma_op obj; 
    12.5f, obj; 

    return 0; 
} 

मूल रूप से, मैं एक फ्लोट के साथ दोनों पक्षों से अल्पविराम ऑपरेटर को उपयोग करने की कोशिश कर रहा हूं। सदस्य फ़ंक्शन होने के कारण मुझे केवल obj, float_val लिखने की अनुमति मिलती है, जबकि अतिरिक्त सहायक गैर-मित्र गैर-सदस्य फ़ंक्शन होने से मुझे float_val, obj लिखने की अनुमति मिलती है; लेकिन सदस्य ऑपरेटर फ़ंक्शन को कॉल नहीं किया जाता है।

जीसीसी रोष:

comma.cpp: In function ‘void operator,(const float&, const comma_op&)’: 
comma.cpp:19: warning: left-hand operand of comma has no effect 
comma.cpp:19: warning: right-hand operand of comma has no effect 


नोट: मुझे एहसास है कि ओवरलोडिंग ऑपरेटरों, वह भी कॉमा से अधिक अधिभारित करने के लिए।, भ्रमित है और यह एक शुद्धवादी दृष्टिकोण से सलाह नहीं दी जाती है। मैं सिर्फ सी ++ बारीकियों को सीख रहा हूं।

+2

शैली के एक बिंदु के रूप में, मुझे लगता है कि इसे ऑपरेटरों के अर्थ को फिर से परिभाषित करने के लिए सामान्य रूप से मूर्खतापूर्ण माना जाता है क्योंकि कोड को बनाए रखना मुश्किल होता है: एक * बी एक गुणा कर रहा है या इसे वेक्टर क्रॉस के रूप में फिर से परिभाषित किया गया है उत्पाद? (कुछ लोग कहेंगे कि एक ठीक है।) – Skizz

+0

@ स्किज़: मुझे लगता है कि आपने इस पोस्ट की शुरुआत से _Note_ में उल्लेख किया है, जो मैंने ध्यान दिया है। – legends2k

+0

और अल्पविराम अधिभार अक्सर इसकी प्राथमिकता –

उत्तर

19
void operator,(const float &rhs) 

आपको यहां const की आवश्यकता है।

void operator,(const float &rhs) const { 
    cout << this->val << ", " << rhs << endl; 
} 

कारण यह है कि

rhs, lhs 

फोन करेगा

rhs.operator,(lhs) 

rhs के बाद से एक const comma_op& है, विधि एक const विधि होना चाहिए। लेकिन आप केवल एक गैर-constoperator, प्रदान करते हैं, इसलिए डिफ़ॉल्ट परिभाषा का उपयोग किया जाएगा।

+0

ओह कॉन्स्ट सही-नस्ल की वजह से समस्याग्रस्त है! हाँ, यह अब काम करता है, धन्यवाद :) – legends2k

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