Si vous voulez vraiment définir l'opérateur à l'extérieur et se lier d'amitié que l'instanciation de l'opérateur qui coïncide dans le type avec ce modèle instanciation, la syntaxe correcte est:
template <typename T> class test; // forward declare template class
template <typename T> // forward declare the templated operator
std::ostream& operator<<(std::ostream&, test<T> const &);
template <typename T>
class test { // define the template
friend std::ostream& operator<< <T>(std::ostream&, test<T> const &); // befriend
};
template <typename T> // define the operator
std::ostream& operator<<(std::ostream& o, test<T> const &) {
return o;
}
Dans la plupart des cas, il ne vaut pas les tracas de Tirez la définition hors de la classe, sachant que vous devez toujours le fournir dans un en-tête et le travail supplémentaire requis.
Notez également qu'il existe de légères différences pour le compilateur en ce qui concerne la recherche. Dans le cas où la fonction est inline dans la définition de la classe, le compilateur ne trouvera pas cette fonction sauf si l'un des arguments est réellement du type du template, donc il réduit efficacement la visibilité et la quantité de travail que le compilateur doit faire (si le modèle operator<<
est défini en dehors de la classe, le compilateur le trouvera comme candidat pour la résolution de surcharge dans tous les endroits où il trouve a << b
, seulement pour le rejeter dans tous les cas où le second argument n'est pas test<T>
(et il montrera l'opérateur basé sur le modèle en tant que candidat dans tous les messages d'erreur où il ne peut pas correspondre operator<<
, qui est déjà une liste assez longue.)
Vous devriez lire http://www.parashift.com/c++-faq-lite /templates.html#faq-35.16. BTW, comme un modèle amusant ction sera implicitement en ligne de toute façon. – UncleBens
La prochaine fois, veuillez utiliser le bouton '101010' au sommet du volet d'édition pour mettre en forme le code dans votre message. Ceci, et beaucoup plus est expliqué sur la fenêtre flottante "Comment éditer" sur la droite du volet d'édition. – sbi