Saya memiliki fungsi template yang kelebihan beban:
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;
}
Jika saya menyebutnya seperti ini:
auto a = overMax(4, 7.2); // uses first template
auto b = overMax<double>(4, 7.2); // uses second template
semuanya bekerja dengan sempurna, tetapi
auto c = overMax<int>(4, 7.2); // error
menyebabkan panggilan ambigu.
Mengapa begitu dengan int , dan OK jenis apa yang lain?
int
, apakah Anda menentukantypename RT
atautypename T1
? Karena4
juga merupakanint
, bisa jadi keduanya. Dengandouble
,4
tidak secara langsung cocok dengan jenisnyadouble
, jadi kelebihan kedua lebih disukai.Jawaban:
RT
tidak dapat dikurangkan, jadi ketika tidak menyediakannya, hanyatemplate<typename T1, typename T2> auto overMax(T1 a, T2 b)
dapat dipanggil.Ketika Anda (sebagian) memberikan satu argumen templat, kedua metode tersebut layak,
tetapi tergantung dari argumen, seseorang dapat menjadi kandidat yang lebih baik:
Untuk
auto b = overMax<double>(4, 7.2); // uses second template
Keduanya
overMax<double, int, double>
danoverMax<double, double>
layak.Tapi
overMax<double, int, double>
ini sama persissedangkan
overMax<double, double>
membutuhkanint
untukdouble
konversi.Untuk
auto c = overMax<int>(4, 7.2); // Ambiguous call
Keduanya
overMax<int, int, double>
danoverMax<int, double>
layak.Tetapi tidak ada pasangan yang lebih baik atau lebih terspesialisasi, sehingga panggilannya ambigu.
sumber
overMax<int>(4, 7.2)
akan dalam kasus pertamaT1=int
(disediakan),T2=double
(disimpulkan) dan dalam kasus keduaRT=int
(disediakan),T1=int, T2=double
(disimpulkan). Definisi konten dari kedua metode tidak digunakan untuk memilih kelebihan muatan.