Eu tenho uma função de modelo sobrecarregada:
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;
}
Se eu chamar assim:
auto a = overMax(4, 7.2); // uses first template
auto b = overMax<double>(4, 7.2); // uses second template
tudo funciona perfeito, mas
auto c = overMax<int>(4, 7.2); // error
causa chamada ambígua.
Por que é assim com int e OK que outros tipos?
c++
templates
c++17
visual-studio-2019
template-argument-deduction
amplificador
fonte
fonte
int
, você está especificando otypename RT
ou otypename T1
? Como4
também é umint
, também pode ser. Comdouble
,4
não corresponde diretamente ao tipodouble
, portanto, a segunda sobrecarga é preferida.Respostas:
RT
não é dedutível, portanto, quando não o fornece, apenastemplate<typename T1, typename T2> auto overMax(T1 a, T2 b)
pode ser chamado.Quando você (parcialmente) fornece um argumento de modelo, ambos os métodos são viáveis,
mas, dependendo do argumento, pode-se ser um candidato melhor:
Para
auto b = overMax<double>(4, 7.2); // uses second template
Ambos
overMax<double, int, double>
eoverMax<double, double>
são viáveis.Mas
overMax<double, int, double>
é correspondência exataenquanto que
overMax<double, double>
exigeint
adouble
conversão.Para
auto c = overMax<int>(4, 7.2); // Ambiguous call
Ambos
overMax<int, int, double>
eoverMax<int, double>
são viáveis.Mas nem uma correspondência melhor ou mais especializada, portanto, a chamada é ambígua.
fonte
overMax<int>(4, 7.2)
seria no primeiro casoT1=int
(fornecido),T2=double
(deduzido) e no segundo casoRT=int
(fornecido),T1=int, T2=double
(deduzido). A definição de conteúdo de ambos os métodos não é usada para selecionar sobrecarga.