2010-03-16 5 views
7

Ich habe die Antwort NEIN! Weil die Übergabe nach Wert und die Weitergabe nach Referenz identisch mit dem Aufrufer aussieht.Können wir eine Funktion überladen, nur weil ein Parameter ein Wert oder eine Referenz ist?

jedoch unter dem Code kompiliert rechts

class A { 

public: 
void f(int i) {}  

void f(int& i) {} 
}; 

Aber wenn ich versuche, es zu benutzen, gibt es Fehler kompilieren.

int main() { 

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

Warum deaktiviert der Compiler es nicht, auch ohne zu wissen, dass es verwendet wird?

+2

Es würde helfen, wenn Sie den aktuellen Compiler-Fehler und die Zeilennummer zeigte. –

+3

dupe: http://stackoverflow.com/questions/930323/f5-and-int-x-fx-to-call-different-functions –

Antwort

3

Ja, sie können basierend auf Referenz oder nicht überladen werden. Deshalb ist es vollkommen in Ordnung, sie so nebeneinander zu haben; Sie sind anders.

Das Problem hat mit Ambiguität zu tun. Während f(1) nur an einer Variante aufgerufen werden kann, kann f(i) an beiden aufgerufen werden. Beides ist vorzuziehen, daher erhalten Sie einen Fehler für die Mehrdeutigkeit. Wenn Sie eine dritte Funktion hinzufügen würden, wären foo (const int&), alle Aufrufe mehrdeutig. Aber alle sind immer noch Überladungen voneinander und nicht widersprüchlich.

Ich stimme zu, es ist seltsam, in der Lage zu sein, drei Überlastungen einer Funktion zu haben und in der Lage zu sein, direkt keine aufzurufen. Vielleicht hat jemand anderes mehr hinzuzufügen.

9

Sie können jede Methode aufrufen:

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 für clever :) – GManNickG

+5

'(a. * F) (i) ; 'sollte ausreichen. –

+1

hast du wahrscheinlich gemeint (a. * T) (i); (nicht (a. * f)) – a1ex07