2008-10-20 7 views
3

Ci-dessous sont des lignes de "C++ langage de programmation"C++ fonction de modèle SURCHARGE

template<class T > T sqrt(T); 
template<class T > complex<T> sqrt(complex<T>); 
double sqrt(double); 
void f(complex<double> z) 
{ 
s q r t (2); // sqrt<int>(int) 
sqrt(2.0) ; // sqrt(double) 
sqrt(z) ; // sqrt<double>(complex<double>) 
} 

Je ne comprends pas pourquoi sqrt (z); appelle sqrt<double>(complex<double>) peut tout organisme s'il vous plaît expliquer.

Auteur dit, T sqrt<complex<T>> est plus spécialisé que T sqrt <T> mais il y a une déclaration séparée pour template<class T > complex<T> sqrt(complex<T>); pourquoi ne pas l'utiliser?

+0

Désolé les gars je ne comprends pas sqrt (complexe ) représente complexe sqrt > – yesraaj

Répondre

2

Eh bien, la fonction utilisée est celle dont vous parlez sqrt<double>(complex<double>) est une instance du modèle template <class T> complex<T> sqrt(complex<T>). Votre malentendu était dans la signification de l'instance du modèle et non dans le processus de surcharge.

6

Avec le recul, il aurait été plus facile si Bjarne aurait écrit comme

template<class T> T sqrt(T); 
template<class U> complex<U> sqrt(complex<U>); 
double sqrt(double); 
void f(complex<double> z) 
{ 
    sqrt (2); // sqrt<int>(int) 
    sqrt(2.0) ; // sqrt(double) 
    sqrt(z) ; // sqrt<double>(complex<double>) 
} 

afin que vous ne soyez pas confus par tous les différents T de. Mais l'idée est simple; C++ trouve la meilleure correspondance. Il y a trois fonctions possibles. Les deux premiers sont des correspondances parfaites (aucune conversion nécessaire), de sorte que la version sans modèle est ignorée. Maintenant, nous avons T = complexe et U = double. Quelle version est choisie? Bjarne explique que le deuxième modèle est choisi ici, parce qu'il est plus spécialisé. Cela signifie que pour tout type U, il existe un type T=complex<U> qui rend les signatures des deux modèles identiques.

Questions connexes