next up previous contents
Next: Les règles... Up: Correspondance des arguments Previous: Différencier les types

Trouver la fonction associée au nom

Le compilateur doit pouvoir associer le nom à la fonction. Il choisira celle dont les arguments correspondent le ``mieux'' aux arguments de l'appel.

La règle exacte est plutôt compliquée.

On prend pour chaque argument, l'ensemble des fonctions qui correspondent le mieux (dans un sens qui sera précisé plus loin), on prend ensuite l'intersection de ces ensembles. il faut que cette intersection ait exactement un seul élément. Mais il y aussi une règle supplémentaire : il faut aussi que la fonction choisie corresponde strictement mieux pour au moins un argument, dans tous les autres cas, le compilateur considérera qu'il y a ambiguïté et donc rejettera l'appel.

Exemple :

class X{ public: X(int);};
class Y {};
void f(X,int);
void f(Y,double);
void f(X,double);
void main(){
   f(1,1);
}
et donc on choisira f(X,int).

Exemple :

class A{};
class B:A{};
class C{};
class D:B,C{};
 void f(C*,C*);
 void f(A*,B*);
 void f(B*,A*);
 D* pd;
 
 f(pd,pd);
Une conversion d'un D* vers un B* est meilleure qu'une conversion d'un D* vers un A*. On a: L'intersection donne f(C*,C*) mais elle n'est meilleure pour aucun argument.




Mon Oct 20 14:02:48 MET 1997