2010-03-16 15 views
7

Recibí la respuesta ¡NO! Porque pasar por valor y pasar por referencia parece idéntico a la persona que llama.¿Podemos sobrecargar una función basándose solo en si un parámetro es un valor o una referencia?

Sin embargo, el código de abajo compila derecho

class A { 

public: 
void f(int i) {}  

void f(int& i) {} 
}; 

Pero cuando trato de usarlo, no hay error de compilación.

int main() { 

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

¿Por qué el compilador desactivarlo incluso sin saber que va a ser utilizado?

+2

Sería de gran ayuda si mostró que el número de error del compilador y la línea real. –

+3

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

Respuesta

3

Sí, pueden estar sobrecargados por referencia o no. Es por eso que está perfectamente bien hacer que coexistan así; ellos son diferentes.

El problema tiene que ver con la ambigüedad. Mientras que f(1) solo se puede invocar en una variación, se puede llamar a f(i) en ambos. Ninguno es preferible, por lo tanto, obtiene un error de ambigüedad. Si agregó una tercera función, foo (const int&), , todas las llamadas a serían ambiguas. Pero todos siguen siendo sobrecargas el uno del otro, y no conflictivos.

Acepto que es extraño poder tener tres sobrecargas de una función y poder llamar directamente a ninguna. Quizás alguien más tiene más para agregar.

9

Puede llamar a cada método:

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 para inteligente :) – GManNickG

+5

'(a. * F) (i) ; 'debería ser suficiente. –

+1

probablemente quiso decir (a. * T) (i); (no (a. * f)) – a1ex07

Cuestiones relacionadas