La question est le code. On dirait que la 2ème fonction est plus spéciale que la 1ère. Pourquoi le plus général est appelé dans le code suivant? Comment puis-je faire l'autre fonction à utiliser?résolution de surcharge des modèles de fonction
template <typename T>
class Base{
public:
Base(){}
void print() const {cout<<"Base class"<<endl;}
};
template <typename T>
class Derived :public Base<T>{
public:
Derived() {}
void print() const {cout<<"Derived class"<<endl;}
};
template <typename T>
void func(T x){ // <----- Why is function is called?
x.print();
cout<<"in func(T)"<<endl;
}
template <typename T>
void func(const Base<T>& x){
x.print();
cout<<"in func(Base<T>)"<<endl;
}
int main() {
Base<int> b;
Derived<int> d;
func(d);
return 0;
}
Notez que je passe l'objet Dérivé à la fonction.
Ce message peut vous aider: http://stackoverflow.com/questions/22411482/c-template-functions-overload-resolution. Voir la réponse de @ NikosAthanasiou. – chema989
Copie possible de: http://stackoverflow.com/questions/31563580/c-templated-function-overloading-rules?lq=1 – sameerkn