Exercice 126
Énoncé
Soient les définitions suivantes de patrons de fonctions :
template void fct (T a, U b) { ... } // patron I
template void fct (T * a, U b) { ... } // patron II
template void fct (T, T, T) { ... } // patron III
void fct (int a, float b) { .....} // fonction IV
Avec ces déclarations :
int n, p, q ;
float x, y ;
double z ;
Quels sont les appels corrects et, dans ce cas, quels sont les patrons utilisés et les
prototypes des fonctions instanciées ?
fct (n, p) ; // appel I
fct (x, y ) ; // appel II
fct (n, x) ; // appel III
fct (n, z) ; // appel IV
fct (&n, p) ; // appel V
fct (&n, x) ; // appel VI
fct (&n, &p, &q) // appel VII
Ici, on fait appel à la fois à une surdéfinition (patrons I, II et III) et à une spécialisation
de patron (fonction IV).
I) patron I void fct (int, int) ;
II) patron I void fct (float, float) ;
III) fonction IV void fct (int, float) ;
IV) patron I void fct (int, double) ;
V) erreur : ambigüité entre fct (T, U) et fct (T*, U)
VI) erreur : ambigüité entre fct (T, U) et fct (T*, U)
VII) patron III void fct (int *, int *, int *) ;
Le patron II ne peut jamais être utilisé. En effet, chaque fois qu’il pourrait l’être, le
patron I peut l’être également, de sorte qu’il y a ambiguïté. Le patron II est donc, ici,
parfaitement inutile.
Notez que si nous avions défini simultanément les deux patrons :
template void fct (T a, U b) ;
template void fct (T a, T b)
308
Précédent

- 309/398

Suivant