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 🙂


Log in to reply