2010-10-14 51 views
5

J'ai écrit un modèle de fonction et une fonction templated explicitement spécialisée qui prend simplement en 3 arguments et calcule le plus grand d'entre eux et l'imprime.Fonctions Templated .. ERREUR: modèle-id ne correspond à aucune déclaration de modèle

La fonction spécialisée provoque une erreur, alors que le modèle fonctionne correctement. Mais je veux travailler avec char * type.

C'est l'erreur que je reçois => error: template-id ‘Max<>’ for ‘void Max(char, char, char)’ does not match any template declaration

Après mon code:

template <typename T> 
    void Max(T& a,T& b,T& c) 
    { 
      if(a > b && a >> c) 
      { 
        cout << "Max: " << a << endl; 
      } 
      else if(b > c && b > a) 
      { 
        cout << "Max: " << b << endl; 
      } 
      else 
      { 
        cout << "Max: " << c << endl; 
      } 
    } 

    template <> 
    void Max(char* a,char* b,char* c) 
    { 
      if(strcmp(a,b) > 0) 
      { 
        cout << "Max: " << a << endl; 
      } 
      else if(strcmp(b,c) > 0) 
      { 
        cout << "Max: " << b << endl; 
      } 
      else 
      { 
        cout << "Max: " << b << endl; 
      } 
} 
+0

d'abord faire une bonne signature originale. template void Max (T & B, T & B, T & C) –

+0

Dans mon cas, il est provoqué par l'ajout de const à returnt type specilizatoin, ce qui entraîne une discordance avec la fonction de modèle primaire. – FaceBro

Répondre

7

Vous devez prendre les pointeurs par référence:

template <> 
void Max(char*& a,char*& b,char*& c) 

Cela dit , il serait mieux pas d'utiliser un specializ explicite ation et simplement surcharger la fonction:

void Max(char* a, char* b, char* c) 

Il est presque toujours une mauvaise idée de spécialiser les modèles de fonction. Pour en savoir plus, voir "Why Not Specialize Function Templates?" Herb Sutter

3

je suis tombé sur le même problème et résolu en utilisant typedef:

typedef char * charPtr; 
template <> 
void Max(charPtr &a, charPtr &b, charPtr &c)