2012-10-09 3 views
3

Pourquoi ne voit-on pas une erreur «appel non défini à une fonction surchargée» avec le code ci-dessous? juste parce que int est un type intégré? où dans la norme puis-je trouver la garantie pour la conversion en type intégré, comme dans le code ci-dessous? ... merci!surcharge de fonction et résolution de conversion de type

#include <iostream> 
using namespace std; 

class B { 
public: 
operator int(){ return 0; } 
}; 

class A { 
public: 
A(int i) { }; 
}; 

void f (int i) { cout << "overload f(int) was used!";}; 
void f (A a) { cout << "overload f(A) was used!" ;}; 


int main() { 
    B b; 
    f(b); 
} 
+1

Avez-vous essayé avec A étant directement constructible à partir de B, en ajoutant 'A :: A (const B &)'? – PiotrNycz

+0

Par * appel non défini à la fonction de surcharge *, voulez-vous dire * ambiguë *? Les erreurs non définies se déclenchent lorsque le compilateur correspond à un symbole mais que l'éditeur de liens ne le trouve pas. –

+0

@David oui, je voulais dire "ambigu". Je vous remercie. – alexandreC

Répondre

7

Cela n'a rien à voir avec le fait d'être un type intégré. Vous avez défini operator int pour B. Cela signifie que vous avez fourni une conversion définie par l'utilisateur de B à int. Selon le paragraphe 12.3.4 de la norme, "au plus une conversion définie par l'utilisateur (constructeur ou fonction de conversion) est implicitement appliquée à une seule valeur." C'est pourquoi il n'est pas converti en A, car cela nécessiterait deux conversions implicites.

Les règles pour déterminer exactement quand cela se produit sont quelque peu compliquées, donc beaucoup de gens vous conseillent d'éviter de fournir des conversions définies par l'utilisateur. Une autre façon de les définir est de fournir un constructeur avec un argument; vous pouvez ajouter explicit au début pour éviter qu'il ne soit appliqué implicitement. Lorsque vous appelez f(b), le compilateur applique la conversion que vous avez fournie pour convertir b en int. Si vous voulez le convertir en A, vous devrez définir une conversion de B à A, ou d'appliquer l'une des conversions de manière explicite, comme f(int(b)) ou f(A(b)).

+2

Norme ISO 12.3.4: "Au plus une conversion définie par l'utilisateur (constructeur ou fonction de conversion) est implicitement appliquée à une seule valeur ." –

+0

^vous devriez ajouter ceci à la réponse. –

+1

@LuchianGrigore: J'étais sous l'impression que ce n'était pas fondamental, mais juste une connaissance intermédiaire de la langue ... :) BTW, * présomptueux * n'est probablement pas le mot que vous cherchiez. –