L'exemple suivant compile bien mais je ne peux pas comprendre comment séparer la déclaration et la définition de l'opérateur < <() est ce cas particulier.Comment diviser la définition de la fonction ami modèle dans la classe modèle?
Chaque fois que j'essaie de diviser l'ami de définition cause un problème et que gcc se plaint de l'opérateur < <() la définition doit prendre exactement un argument.
#include <iostream>
template <typename T>
class Test {
public:
Test(const T& value) : value_(value) {}
template <typename STREAM>
friend STREAM& operator<<(STREAM& os, const Test<T>& rhs) {
os << rhs.value_;
return os;
}
private:
T value_;
};
int main() {
std::cout << Test<int>(5) << std::endl;
}
opérateur < <() est censé avoir un premier paramètre libre pour travailler avec différents types de flux de sortie (std :: Cout, std :: wcout ou boost :: asio :: :: ip tcp: : iostream). Le second paramètre devrait être lié à une version spécialisée de la classe environnante.
Test<int> x;
some_other_class y;
std::cout << x; // works
boost::asio::ip::tcp::iostream << x; // works
std::cout << y; // doesn't work
boost::asio::ip::tcp::iostream << y; // works
En outre en utilisant une fonction non-membre ne équivaut pas à diviser la définition et la déclaration parce que non-membres fonctions ne peuvent pas accéder attributs privés de la classe.
dup possible: http://stackoverflow.com/questions/476272/how-to-properly-overload-the-operator-for-an-ostream – Stephen
Pourquoi voulez-vous paramétrer le type OSTREAM? idiome commun serait l'opérateur << comme définir: 'ami std :: ostream & operator << (std :: ostream & os, Test & rhs) {...}' –
@dribeas: parce que je veux être en mesure d'utiliser d'autres flux de sortie aussi bien. Comme boost :: asio :: ip :: tcp :: iostream et boost :: asio :: local :: stream_protocol :: iostream. – joke