Ich versuche, meine eigene Logging-Klasse zu schreiben und es als Stream verwenden:C++ Stream als Parameter, wenn eine Überlastung Operator <<
logger L;
L << "whatever" << std::endl;
Dies ist der Code, den ich mit gestartet:
#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;
}
Aber ich war ein Fehler, wenn ich versuche zu sagen zu kompilieren, dass es für die Betreiber keine Definition war < < (wenn 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’
Also, ich habe versucht, Operator < < zu überlasten, um diese Art von Streams zu akzeptieren, aber es macht mich verrückt. Ich weiß nicht, wie ich es machen soll. Ich habe Loking an, zum Beispiel der Definition von std :: endl am Ostream Header-Datei und geschrieben eine Funktion mit diesem Header:
logger& operator <<(logger& log, const basic_ostream<char,char_traits<char> >& (*s)(basic_ostream<char,char_traits<char> >&))
Aber kein Glück. Ich habe das selbe mit Schablonen versucht, anstatt Char direkt zu verwenden, und versuchte auch einfach, "const ostream & os" und nichts zu verwenden.
andere Sache, die nervt sie ist, dass in der Fehlerausgabe, das erste Argument für Betreiber < < Änderungen, manchmal ist es ein Verweis auf einen Zeiger, sieht manchmal wie eine doppelte Referenz ...
möglich Duplikat [std :: endl ist unbekannter Art wenn Betreiber Überlastung <<] (http://stackoverflow.com/questions/1134388/stdendl-is-of-unknown-type-when-overloading-operator) – sth
Gute Frage. Ich bin letzte Woche auf dasselbe Problem gestoßen. Traurige Stimme der Erfahrung in den Antworten unten ... –
@ T.E.D .: Ähm ... danke? –