J'ai une fonction de modèle surchargée:
template<typename T1, typename T2>
auto overMax(T1 a, T2 b)
{
std::cout << __FUNCSIG__ << std::endl;
return b < a ? a : b;
}
template<typename RT, typename T1, typename T2>
RT overMax(T1 a, T2 b)
{
std::cout << __FUNCSIG__ << std::endl;
return b < a ? a : b;
}
Si je l'appelle comme ça:
auto a = overMax(4, 7.2); // uses first template
auto b = overMax<double>(4, 7.2); // uses second template
tout fonctionne parfaitement, mais
auto c = overMax<int>(4, 7.2); // error
provoque un appel ambigu.
Pourquoi en est-il ainsi avec int , et OK quels autres types?
c++
templates
c++17
visual-studio-2019
template-argument-deduction
amplificateur
la source
la source
int
, spécifiez-vous letypename RT
ou letypename T1
? Puisque4
c'est aussi unint
, ça pourrait être l'un ou l'autre. Avecdouble
,4
ne correspond pas directement au typedouble
, la deuxième surcharge est donc préférable.Réponses:
RT
n'est pas déductible, donc lorsqu'il ne le fournit pas, seultemplate<typename T1, typename T2> auto overMax(T1 a, T2 b)
peut être appelé.Lorsque vous fournissez (partiellement) un argument de modèle, les deux méthodes sont viables,
mais selon l'argument, on peut être un meilleur candidat:
Pour
auto b = overMax<double>(4, 7.2); // uses second template
Les deux
overMax<double, int, double>
etoverMax<double, double>
sont viables.Mais
overMax<double, int, double>
est correspondance exactealors que
overMax<double, double>
nécessiteint
ladouble
conversion.Pour
auto c = overMax<int>(4, 7.2); // Ambiguous call
Les deux
overMax<int, int, double>
etoverMax<int, double>
sont viables.Mais ni l'un ni l'autre ne correspond mieux ni n'est plus spécialisé, donc l'appel est ambigu.
la source
overMax<int>(4, 7.2)
serait dans le premier casT1=int
(fourni),T2=double
(déduit) et dans le second casRT=int
(fourni),T1=int, T2=double
(déduit). La définition du contenu des deux méthodes n'est pas utilisée pour sélectionner la surcharge.