2010-05-15 5 views
0

Je travaille sur un modèle de classe de conteneur (pour int, bool, cordes, etc.), et je suis coincé avec cette erreuravertissements de modèle et l'aide d'erreur, (gcc)

cont.h:56: error: expected initializer before '&' token 

pour cette section

template <typename T> 
const Container & Container<T>::operator=(const Container<T> & rightCont){ 

qu'est-ce que j'ai fait de mal là-bas?

Vous ne savez pas non plus ce que ce message d'avertissement signifie.

cont.h:13: warning: friend declaration `bool operator==(const Container<T>&, const Container<T>&)' declares a non-template function 
cont.h:13: warning: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning 

à ce poste

template <typename T> 
class Container{ 
    friend bool operator==(const Container<T> &rhs,const Container<T> &lhs); 
public: 

Répondre

1

Dans le premier cas, vous avez fait des choses à l'envers. Lorsque vous spécifiez le type de retour, vous devez inclure la liste des paramètres de modèle dans l'identificateur de modèle (Container<T>), mais lorsque vous spécifiez le type de paramètre, vous n'avez pas besoin de le faire (juste Container est assez)

template <typename T> 
const Container<T> & Container<T>::operator=(const Container & rightCont){ 
    ... 

Vous l'avez fait dans l'autre sens pour une raison quelconque. Dans le second cas, lorsque vous déclarez operator == en tant qu'ami, il vous avertit simplement que dans ce cas operator == vous faites référence à une fonction ordinaire. Cela ne peut pas être une spécialisation d'un modèle. C'est à dire. pour la classe Container<int> la fonction

bool operator==(const Container<int> &rhs, const Container<int> &lhs) { 
    // ... 
} 

sera un ami. Mais la spécialisation du modèle de fonction

template <class U> 
bool operator==(const Container<U> &rhs, const Container<U> &lhs) { 
    // ... 
} 

pour U == int ne pas être un ami de Container<int>. Si c'est votre intention, vous allez bien.

Si vous voulez lier d'amitié avec une spécialisation spécifique du modèle ci-dessus, vous auriez à dire

template <typename T> 
class Container { 
    friend bool operator==<T>(const Container<T> &rhs, const Container<T> &lhs); 
    ... 

Si vous voulez lier d'amitié avec toute spécialisation du modèle ci-dessus, vous auriez dire

template <typename T> 
class Container { 
    template <class U> 
    friend bool operator==(const Container<U> &rhs, const Container<U> &lhs); 
    ... 
2

Dans le premier cas, vous dites que Container la première fois au lieu de Container<T>.

Dans le second cas, je pense que vous devez répéter le template: alors que les fonctions membres d'une classe template sont implicitement modélisées, les fonctions friend ne le sont pas forcément, donc il faut être plus explicite. Je ne suis pas sûr de ce que la syntaxe exacte dont vous avez besoin à cette fin, mais je pense qu'il est:

  • avant la classe, template<typename T> bool operator==( etc
  • dans la classe, bool operator==<>( etc

Je pense que c'est Ce que le message d'erreur essaie de transmettre, mais pas super-clairement.

Questions connexes