Considérez ce morceau de code:appel Ambigu lorsque vous appelez la fonction récursive modèle variadique surcharge
template<typename FirstArg>
void foo()
{
}
template<typename FirstArg, typename... RestOfArgs>
void foo()
{
foo<RestOfArgs...>();
}
int main()
{
foo<int, int, int>();
return 0;
}
Il ne compile pas en raison de l'appel foo<RestOfArgs...>();
ambigu quand RestOfArgs
n'a qu'un seul élément ({int}
).
Mais cette compile sans erreur:
template<typename FirstArg>
void foo(FirstArg x)
{
}
template<typename FirstArg, typename... RestOfArgs>
void foo(FirstArg x, RestOfArgs... y)
{
foo(y...);
}
int main()
{
foo<int, int, int>(5, 6, 7);
return 0;
}
Pourquoi est-il une ambiguïté dans le premier cas?
Pourquoi n'y a-t-il pas d'ambiguïté dans le second cas?
Mon hypothèse est qu'il a quelque chose à voir avec le fait que la signature de la fonction sont ses arguments, et que «» et '' sont indiscernables dans un cas, mais dans l'autre quelquechose. –
yeputons
Regardez [overload_resolution] (http://en.cppreference.com/w/cpp/language/overload_resolution) et [Function_template_overloading] (http://en.cppreference.com/w/cpp/language/function_template#Function_template_overloading) – Jarod42
@ Jarod42 Je l'ai regardé mais je ne connais toujours pas la réponse à mes questions. –