Dois-je explicitement instancier le type d'un gabarit de fonction lorsqu'il s'agit de la déduction du type de référence. Si tel est le cas, où est l'ambiguïté? Comparons 2 suivant des extraits de code:Déduction des types de référence dans les fonctions de gabarit
1er: link for the code
template <typename T>
void foo(T& var, void(*func)(T&)) // T must be instantiated with int and it does .
{
++var;
}
void ret(int & var){}
int main()
{int k =7;
foo(k, &ret);
cout<<k;//prints 8
}
Maintenant retirons s decleration 's dans foo()' & et nous avons une erreur.
2ème: link for the code
template <typename T>
void foo(T var, void(*func)(T)) // T must be instantiated with int& but it doesn't.
{
++var;
}
void ret(int & var){}
int main()
{int k =7;
foo(k, &ret); //error: no matching function for call to 'foo(int&, void (*)(int&))'
cout<<k;
}
Toutefois, si j'appelle foo par instancier explicitement <int&>
"foo<int&>(k,&ret);
", le code donne le même résultat que l'ancien. Quelle est la raison de cette erreur? Où est l'ambiguïté?
Merci.
Comment se fait-il que "int" et "int &" puissent être déduits? Il n'y a pas de fonction déclarant le paramètre "int", mais seulement "int &". void ret (int & var) {}. donc T ne peut être que "int &", sinon la signature de ret (int & var) ne convient pas à T. i.e ret (int var) n'est pas possible. Merci pour votre réponse. –
Donc, il n'y a pas de jeux "P" et "A" dans mon exemple. Il n'y a que P {qui est int &}. "A" ne peut pas être possible comme je l'ai dit dans mon précédent commentaire. Je pense qu'il y a une autre raison à cette ambiguïté mais je ne la trouve pas :( –
Dans l'appel foo (k, ret): 'int' est déduit de 'k-> T', et 'int &' est déduit de ' ret 'avec type' void (int &) '->' void (*) (T) 'Votre ensemble P/A est: A {k, ret} et P {T, void (*) (T)}. selon le texte standard, 'T' est déduit pour chaque paire P/A et il n'en résulte pas le même type. –