Pour le code suivant :
#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");
}
Lorsque je compile le code avec g++ -std=c++1y
Il se plaint :
error: call of overloaded ‘compare(const char [3], const char [3])’ is ambiguous
compare("hi", "is");
Selon les règles de surcharge des templates, les fonctions viables sont :
compare(const T&, const T&) with T = char [3]
compare(const char (&)[N], const char (&)[M]) with N = 3ul, M = 3ul
Ils fournissent tous deux une correspondance aussi bonne (c'est-à-dire exacte) à l'appel. Je devrais donc vérifier laquelle est la plus spécialisée.
Mais d'après mes connaissances limitées, const T&
est plus général que const char (&)[N]
. Je pense donc que compare(const char (&)[N], const char (&)[M])
est plus spécialisé. Mais pourquoi cette appellation est-elle ambiguë ?