J'essaie désespérément de faire fonctionner mes spécialisations mais j'ai toujours du code non compilable à cause de la déduction d'arguments incorrects. Notez que les erreurs ne sont pas liées à la définition des modèles, mais à l'application d'une opération non pertinente dans une mise en œuvre incorrecte du modèle. L'exemple réduit de code démontrant le problème, est le suivant :
struct Test { void Method() const {} };
template<typename T>
void Cmp(T _val) { _val > 1; }
template<>
void Cmp<const Test &>(const Test &_val) { _val.Method(); }
template<>
void Cmp<const char *>(const char *_val) { _val[2]; }
int main()
{
Test test1;
char test2[5];
Cmp(10); // ok, expected
Cmp(test1); // error in Cmp(T)?! but expecting to instantiate Cmp(const Test &)
Cmp(test2); // error in Cmp(T)?! but expecting to instantiate Cmp(const char *)
return 0;
}
Je ne souhaite vraiment pas utiliser des appels explicites comme Cmp<const Test &>(test1)
(qui fonctionne) car, à ma connaissance, le compilateur devrait être capable de déduire les arguments automatiquement et l'idée derrière ces spécialisations est de répartir les appels Cmp de manière transparente (dans le code réel, je définis les opérateurs). Bien sûr, la spécialisation par valeur Cmp<Test>(Test)
fonctionne comme prévu, mais pour les grandes classes sophistiquées non-POD, il est tout simplement ridicule de les passer par valeur.
Quelles que soient les corrections que j'essaie d'appliquer, le compilateur refuse obstinément de choisir la spécialisation par référence en utilisant le modèle général à la place. Il semble que j'ai raté quelque chose d'important, mais je suis vraiment à court d'idées pour expliquer pourquoi mon approche ne fonctionne pas et comment je devrais construire du code exprimant un concept aussi simple du monde C++ non modélisé que le passage de classes par référence. Bien sûr, Google s'est avéré être totalement inutile pour ce problème. J'ai essayé GCC 4.2.1 et 4.4.6.