La surcharge ami de l'opérateur << pour la classe de modèle
Je suis en train de la surcharge de l'opérateur << comme un ami à un modèle de classe Paire, mais je reçois un message d'avertissement du compilateur disant
friend declaration std::ostream& operator<<(ostream& out, Pair<T,U>& v) declares a non template function
pour ce code:
friend ostream& operator<<(ostream&, Pair<T,U>&);
il donne un second avertissement comme une recommandation en disant
if this is not what you intended, make sure the function template has already been declared and add <> after the function name here
Ici est la définition de la fonction
template <class T, class U>
ostream& operator<<(ostream& out, Pair<T,U>& v)
{
out << v.val1 << " " << v.val2;
}
et ici, c'est l'ensemble de la classe.
template <class T, class U>
class Pair{
public:
Pair(T v1, U v2) : val1(v1), val2(v2){}
~Pair(){}
Pair& operator=(const Pair&);
friend ostream& operator<<(ostream&, Pair<T,U>&);
private:
T val1;
U val2;
};
Je n'étais pas sûr de ce que pour tirer de la recommandation d'avertissement, d'autres que j'ai peut-être mettre quelque part dans l'ami de la déclaration. Personne ne sait la syntaxe correcte pour cela? Merci.
Vous devez vous connecter pour publier un commentaire.
Vous déclarer opérateur<< comme le retour d'un ostream&, mais il n'y a pas d'instruction return dans la méthode. Devrait être:
Autre que cela, je n'ai pas de problèmes ou de mises en garde de la compilation de votre code sous Visual Studio 2008 avec des avertissements au niveau 4. Oh, il y a les classiques de l'éditeur de liens erreurs, mais qui est facilement contournée par le déplacement de la fonction de modèle de définition de la déclaration de la classe, comme expliqué dans la C++ FAQ.
Mon code de test:
Vous voulez faire une instance unique (appelé "spécialisation" en termes génériques) de ce modèle un ami. Vous le faites de la manière suivante
Parce que le compilateur connaît à partir de la liste des paramètres que le modèle arguments sont
T
etU
, vous n'avez pas à mettre entre ceux<...>
, de sorte qu'ils peuvent être laissées vides. Notez que vous devez mettre une déclaration deoperator<<
au-dessus de laPair
modèle, comme la suivante:<>
est facile de manquer!Simple inline version:
Modèle révisé version: