2010-03-16 26 views
7

J'ai eu la réponse NON! Car passer par valeur et passer par référence est identique à l'appelant.Peut-on surcharger une fonction uniquement en fonction de la valeur ou de la référence d'un paramètre?

Cependant, le code ci-dessous compile droite

class A { 

public: 
void f(int i) {}  

void f(int& i) {} 
}; 

Mais lorsque je tente de l'utiliser, il y a erreur de compilation. Pourquoi le compilateur ne le désactive-t-il pas même sans savoir qu'il va être utilisé? Pourquoi le compilateur ne le désactive-t-il pas?

+2

Il serait utile que vous montriez l'erreur du compilateur réelle et le numéro de ligne. –

+3

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

Répondre

3

Oui, ils peuvent être surchargés sur la base de référence ou non. C'est pourquoi c'est parfaitement bien de les faire coexister comme ça; ils sont différents.

Le problème est lié à l'ambiguïté. Alors que f(1) ne peut être appelé que sur une variation, f(i) peut être appelée sur les deux. Ni est préférable, donc vous obtenez une erreur pour l'ambiguïté. Si vous avez ajouté une troisième fonction, foo (const int&), tous les appels seraient ambigus. Mais tous sont encore surchargés les uns des autres, et non conflictuels. Je suis d'accord qu'il est étrange de pouvoir avoir trois surcharges d'une fonction, et être capable d'en appeler directement aucune. Peut-être que quelqu'un d'autre a plus à ajouter.

9

Vous pouvez appeler chaque méthode:

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 pour intelligent :) – GManNickG

+5

'(a. * F) (i) ; 'devrait être suffisant. –

+1

vous vouliez probablement dire (a. * T) (i); (not (a. * f)) – a1ex07