J'essaie d'écrire ma propre classe de journalisation et de l'utiliser comme un flux :
logger L;
L << "whatever" << std::endl;
Voici le code avec lequel j'ai commencé :
#include <iostream>
using namespace std;
class logger{
public:
template <typename T>
friend logger& operator <<(logger& log, const T& value);
};
template <typename T>
logger& operator <<(logger& log, T const & value) {
// Here I'd output the values to a file and stdout, etc.
cout << value;
return log;
}
int main(int argc, char *argv[])
{
logger L;
L << "hello" << '\n' ; // This works
L << "bye" << "alo" << endl; // This doesn't work
return 0;
}
Mais j'ai obtenu une erreur en essayant de compiler, disant qu'il n'y avait pas de définition pour l'opérateur<< (en utilisant std::endl) :
pruebaLog.cpp:31: error: no match for ‘operator<<’ in ‘operator<< [with T = char [4]](((logger&)((logger*)operator<< [with T = char [4]](((logger&)(& L)), ((const char (&)[4])"bye")))), ((const char (&)[4])"alo")) << std::endl’
Donc, j'ai essayé de surcharger l'opérateur<< pour accepter ce genre de flux, mais ça me rend fou. Je ne sais pas comment faire. J'ai regardé, par exemple, la définition de std::endl dans le fichier d'en-tête ostream et j'ai écrit une fonction avec cet en-tête :
logger& operator <<(logger& log, const basic_ostream<char,char_traits<char> >& (*s)(basic_ostream<char,char_traits<char> >&))
Mais pas de chance. J'ai essayé la même chose en utilisant des modèles au lieu d'utiliser directement char, et j'ai aussi essayé d'utiliser simplement "const ostream& os", et rien.
Une autre chose qui me dérange est que, dans la sortie d'erreur, le premier argument pour l'opérateur<< change, parfois c'est une référence à un pointeur, parfois ressemble à une référence double....