W następnym kodem:niejednoznaczne wywołanie przeciążony matrycy z parametrem (const T const T) lub (char (i) [N], char (i) [m])
#include <iostream>
using std::cout; using std::endl;
template <typename T>
int compare(const T&, const T&) {
cout << __PRETTY_FUNCTION__ << endl;
return 0;
}
template <size_t N, size_t M>
int compare(const char (&)[N], const char (&)[M]) {
cout << __PRETTY_FUNCTION__ << endl;
return 0;
}
int main(int argc, char *argv[]) {
compare("hi", "is");
}
Kiedy I kompiluje kod z g++ -std=c++1y
, narzeka:
error: call of overloaded ‘compare(const char [3], const char [3])’ is ambiguous
compare("hi", "is");
Zgodnie z zasadami szablonu przeciążeniem, żywotne funkcje to:
compare(const T&, const T&) with T = char [3]
compare(const char (&)[N], const char (&)[M]) with N = 3ul, M = 3ul
Obaj zapewniają równie dobre (tj. Dokładne) dopasowanie do połączenia. Powinienem więc sprawdzić, który z nich jest bardziej wyspecjalizowany.
Ale według mojej ograniczonej wiedzy, const T&
jest bardziej ogólny niż const char (&)[N]
. Więc myślę, że compare(const char (&)[N], const char (&)[M])
jest bardziej wyspecjalizowany. Ale dlaczego ten telefon jest niejednoznaczny?
Zgadzam się na wyjaśnienie, ale rozwiązanie ogranicza użycie drugiego "porównania" do ciągów o równych rozmiarach. – xtofl
Dziękuję. Być może zrozumiałem znaczenie słowa "wyspecjalizowany". Ale jaka jest dokładna zasada "wyspecjalizowanego" w C++? Nie czytałem specyfikacji C++. I czytam książkę C++ Primer. – zhenguoli
@xtofl Był to jeden z przykładów sposobu naprawienia błędu. Innym przykładem może być zmiana pierwszego przeciążenia na dwa różne typy. Nie znając wymagań, nie mogę podać rozwiązania, które je zaspokaja. – interjay