Ich habe eine überladene Vorlagenfunktion:
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;
}
Wenn ich es so nenne:
auto a = overMax(4, 7.2); // uses first template
auto b = overMax<double>(4, 7.2); // uses second template
alles funktioniert perfekt, aber
auto c = overMax<int>(4, 7.2); // error
verursacht mehrdeutige Anrufe.
Warum ist es so mit int und OK welche anderen Typen?
int
Geben Sie dastypename RT
oder das antypename T1
? Da4
ist auch einint
, könnte es auch sein. Mitdouble
,4
nicht direkt den Typ entsprechendouble
wird die zweite Überlast bevorzugt, so.Antworten:
RT
ist nicht ableitbar, kann also nur aufgerufen werden, wenn es nicht bereitgestellt wirdtemplate<typename T1, typename T2> auto overMax(T1 a, T2 b)
.Wenn Sie (teilweise) ein Vorlagenargument angeben, sind beide Methoden realisierbar.
aber je nach Argument kann man ein besserer Kandidat sein:
Zum
auto b = overMax<double>(4, 7.2); // uses second template
Beides
overMax<double, int, double>
undoverMax<double, double>
sind lebensfähig.Aber
overMax<double, int, double>
ist genau passendwährend
overMax<double, double>
erfordertint
zudouble
Konvertierung.Zum
auto c = overMax<int>(4, 7.2); // Ambiguous call
Beides
overMax<int, int, double>
undoverMax<int, double>
sind lebensfähig.Aber weder ist eine bessere Übereinstimmung noch spezialisierter, so dass der Anruf mehrdeutig ist.
quelle
overMax<int>(4, 7.2)
wäre im ersten FallT1=int
(bereitgestellt)T2=double
(abgeleitet) und im zweiten FallRT=int
(bereitgestellt)T1=int, T2=double
(abgeleitet). Die inhaltliche Definition beider Methoden wird nicht zur Auswahl der Überladung verwendet.