/* IFT1166 - démonstration #4 - exercice 2 21 septembre 2003 - M.Lokbani - extrait du livre exo de Delannoy +comments. contact: lokbani@iro.umontreal.ca Cet exercice a pour but de vous familiariser avec la surdéfiniton de fonctions. Les ambiguïtés possibles et comment les résoudre. Copyright (C) 2003 - 2005 Université de Montréal Département d'informatique et de Recherche Opérationnelle M. Lokbani -- Tous Droits Réservés -- All Rights Reserved -- Description: ------------ Surdéfinition de fonctions et recherche des appels corrects et des appels incorrects. */ #include int fct(int a){ return 0;} // fonction I int fct(float a){return 0;} // fonction II void fct(int a,float b){} // fonction III void fct(float a,int b){} // fonction IV int main() { int n,p; float x; char c; double z; fct(n); // appel 1 - fonction I - match exact - fct(x); // appel 2 - fonction II - match exact - fct(n,x); // appel 3 - fonction III - match exact - fct(x,n); // appel 4 - fonction IV - match exact - fct(c); // appel 5 - fonction I - conversion char vers int - fct(n,p); // appel 6 - fonction III&IV - ambiguité - fct(n,c); // appel 7 - fonction III&V - ambiguité - fct(n,z); // appel 8 - fonction III - int (match exact), conversion double vers float - fct(z,z); // appel 9 - fonction III&V - ambiguité - return 0; } /* >g++ -Wall -pedantic -Os -c demo4exo2sol.cpp -o demo4exo2sol.o Les appels 1 à 4 sont corrects, ils correspondent à un match exact. L'appel 5: ici on a une conversion d'un char vers int. demo4exo2sol.cpp: In function `int main()': Appel 6, provoque une ambiguïté: demo4exo2sol.cpp:43: call of overloaded `fct(int&, int&)' is ambiguous demo4exo2sol.cpp:29: candidates are: void fct(int, float) demo4exo2sol.cpp:30: void fct(float, int) En effet n et p sont deux entiers, soit le premier est un match exact et donc le second est converti vers un float ou bien l'inverse => deux choix possibles => ambiguïté. Appel 7, pose le même problème que l'appel 6 sauf qu'ici nous sommes en présence d'un char que nous devons convertir et le premier argument suit le même principe => deux choix possibles => ambiguïté. demo4exo2sol.cpp:44: call of overloaded `fct(int&, char&)' is ambiguous demo4exo2sol.cpp:29: candidates are: void fct(int, float) demo4exo2sol.cpp:30: void fct(float, int) Appel 8, fct(int,double) conversion dégradante du second argument de double vers float, l'appel est donc correct. Appel 9, pose le même problème que les appels 6 & 7 sauf qu'ici nous sommes en présence de deux doubles. Conversions dégradantes double vers int et double vers float => deux choix possibles => ambiguïté. demo4exo2sol.cpp:46: call of overloaded `fct(double&, double&)' is ambiguous demo4exo2sol.cpp:29: candidates are: void fct(int, float) demo4exo2sol.cpp:30: void fct(float, int) >Exit code: 1 */