Problem mit ErrorLog
-
Hallo,
ich habe mir eine Klasse ErrorLog überschrieben, und wollte dafür den operator<< überladen, damit ich sie ähnlich wie ein Stream benutzen kann. Hier mal das wichtigste:
class ErrorLog { friend ErrorLog& operator<<(ErrorLog& lhs, const string& rhs) { lhs.stream << rhs; return lhs; }; public: ErrorLog(); ~ErrorLog(); private: std::ofstream stream; };
Jetzt bekomme ich immer diese drei Fehler
error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. error C2143: Syntaxfehler: Es fehlt ',' vor '&' error C2065: 'rhs': nichtdeklarierter Bezeichner
in Zeile 3 und 4 und ich habe keine Ahnung wieso. Im Internet findet man leider nur Beispiele, wie man den Oparator für normale IO-Streams überlädt, aber nichts für meinen Fall.
-
Bei mir (gcc) klappts.
#include <iostream> #include <string> #include <fstream> /* class Test{ } */ class ErrorLog { friend ErrorLog& operator<<(ErrorLog& lhs, const std::string& rhs) { lhs.stream << rhs; return lhs; }; public: ErrorLog(); ~ErrorLog(); private: std::ofstream stream; }; int main(){ std::cout<<"test\n"; }
-
Aber du machst doch gar nichts mit der Klasse.
Was ich möchte das Klappt ist das hier:int main() { ErrorLog err; err << "test\n"; }
-
Aber ich habe keine Compilerfehler. Ich dachte, es geht Dir um die.
#include <iostream> #include <string> #include <fstream> /* class Test{ } */ class ErrorLog { friend ErrorLog& operator<<(ErrorLog& lhs, const std::string& rhs) { lhs.stream << rhs; return lhs; }; public: ErrorLog() :stream("test.log"){ } // ~ErrorLog(); private: std::ofstream stream; }; int main() { ErrorLog err; err << "test\n"; }
-
Hmm, ich benutze MSVC10 und da bekomm ich eben imemr diese Compilerfehler. Es wäre nett, wenn es mal ein anderer mit dem Microsoft-Compiler probieren könnte, um zu sehen ob es am Compiler liegt, oder irgendwo bei mir der Fehler ist.
-
Noch ein wenig aufgemotzt:
#include <iostream> #include <string> #include <fstream> #include <iomanip> /* class Test{ } */ class ErrorLog { template<typename T> friend ErrorLog& operator<<(ErrorLog& lhs, T const& rhs) { lhs.stream << rhs; return lhs; }; friend ErrorLog& operator<<(ErrorLog& lhs, std::ostream&(*rhs)(std::ostream&)) { lhs.stream << rhs; return lhs; } public: ErrorLog() :stream("test.log"){ } // ~ErrorLog(); private: std::ofstream stream; }; int main() { ErrorLog err; err << "Die ist " << 1 << " test" << std::endl;//endl flusht }
-
Mit VS2010 gibts auch keine Probleme.
Du hast den code wohl nicht 1 zu 1 gepostet.
-
Doch ich hab den Code 1:1 gepostet, ich hatte das std:: vor dem string vergessen
Und danke für deine Verbesserung Volkard