2010-03-16 9 views
7

मुझे जवाब नहीं मिला! क्योंकि मूल्य से गुजरना और संदर्भ से गुजरना कॉलर के समान दिखता है।क्या हम केवल एक पैरामीटर अधिभारित कर सकते हैं कि पैरामीटर एक मान या संदर्भ है या नहीं?

हालांकि, कोड के नीचे सही संकलित

class A { 

public: 
void f(int i) {}  

void f(int& i) {} 
}; 

लेकिन जब मैंने उसे इस्तेमाल करने की कोशिश, वहाँ है त्रुटि संकलित करें।

int main() { 

    A a; 
    int i = 9; 
    int& j = i; 
    a.f(1); 
    a.f(i); 
    a.f(j); 
    return 0; 
} 

संकलक इसे बिना किसी ज्ञात के इसे अक्षम किए बिना अक्षम क्यों करता है?

+2

यह मदद मिलेगी अगर आप वास्तविक संकलक त्रुटि और लाइन नंबर से पता चला है। –

+3

डुप्ले: http://stackoverflow.com/questions/930323/f5-and-int-x-fx-to-call- अलग- कार्यक्षमता –

उत्तर

3

हां, उन्हें संदर्भ के आधार पर ओवरलोड किया जा सकता है या नहीं। यही कारण है कि उन्हें इस तरह सह-अस्तित्व में रखना ठीक है; वे भिन्न हैं।

समस्या अस्पष्टता के साथ है। जबकि f(1) केवल एक भिन्नता पर कॉल किया जा सकता है, f(i) दोनों पर कॉल किया जा सकता है। न तो बेहतर है, इसलिए आपको अस्पष्टता के लिए एक त्रुटि मिलती है। यदि आपने कोई तीसरा फ़ंक्शन जोड़ा है, foo (const int&), सभी कॉल संदिग्ध होंगे। लेकिन सभी अभी भी एक दूसरे के अधिभार हैं, और गैर-विरोधाभासी हैं।

मैं सहमत हूं कि यह एक अजीब बात है कि आप किसी फ़ंक्शन के तीन अधिभार प्राप्त कर सकें, और सीधे किसी को कॉल करने में सक्षम न हों। शायद किसी और को जोड़ने के लिए और अधिक है।

9

आप प्रत्येक विधि कॉल कर सकते हैं:

void (A::*t)(int&) =&A::f; 
A a; 
int i = 9; 
int& j = i; 
a.f(1); // f(int i) 
(a.*t)(i); // f(int& i) 
+1

चतुरता के लिए +1 :) – GManNickG

+5

'(ए। * एफ) (i) ; पर्याप्त होना चाहिए। –

+1

आपको शायद मतलब था (ए। * टी) (i); (नहीं (ए। * एफ)) – a1ex07

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

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