stringstream <--> ostream Problem



  • Dies funktioniert aber leider nicht weil der Ausgabeoperator von stringsream nur einen ostream zurück gibt.

    Dann gib mal die Fehlermeldung an!

    Eigentlich: Temporaere Objekte koennen nur an const-Referenzen gebunden werden.



  • Die ist leider in einer externe Library.

    By the way! Wie bekomme ich eigentlich den Inhalt eines ostream in einen std::string? Das würde mir auch weiterhelfen weil die Logfunktion in der Library für Strings überladen ist.



  • Das würde mir auch weiterhelfen weil die Logfunktion in der Library für Strings überladen ist.

    Wieso machst du aus deinem Stream nicht einen String und uebergibst ihn dann erst. Ich halte es fuer sinnfrei der Logfunktion einen Stream zu uebergeben.

    std::stringstream s;
    s << ... << ... << '\n';
    log(s.str());
    

    Und dann solltest due vielleicht mal das echte Problem schildern und nicht dein komischen Loesungsansatz der total verquer zu sein scheint. Also nicht: Ich moechte es so und so machen, wie kriege ich es hin. Sondern: Das ist das Problem, hier die Signatur, wie mache ich es.



  • Wie man sieht hat die Logfunktion noch mehr Parameter! Das Problem ist aber definitiv der zweite und die Sache mit stringstream!

    test.cpp:256: error: no matching function for call to ‘log(const char*&, const char [11], std::basic_ostream<char, std::char_traits<char> >&, logging::level_e)’
    note: candidates are: virtual void logging::ILogger::log(const char*, logging::level_e)
    note: virtual void logging::ILogger::log(const char*, const char*, const char*, logging::level_e)
    note: virtual void logging::ILogger::log(const std::stringstream&, logging::level_e)
    note: virtual void logging::ILogger::log(const char*, const char*, const std::stringstream&, logging::level_e)

    @knivil:
    Den Trick mit der Ausgabe vor dem Logaufruf ist mir schon klar, aber wie erwähnt aus bestimmten Gründen will! ich das erzeugen der Ausgabe in de Logaufruf selber hineinbringen!



  • Wieso kann das Log nicht einfach einen generellen std::ostream bekommen, was ist der Grund aus dem es auf jedem Fall nur ein stringstream sein kann?



  • @dot:
    siehe meinen Beitrag von 14:17:06 07.02.2013



  • Und was genau gibts dort zu sehen?

    Edit: Um den "Inhalt" eines ostream in einen string zu bekommen, musst du eben den Inhalt des ostream aus dem ostream in einen String lesen...



  • @dot: Stichwort "externe Library"



  • Und was genau ist jetzt das Problem mit dieser "externen Library"?



  • Wenn man so will könnte man sagen:
    Die Frage ist wie kann ich in diese Library einen ostream ausgeben!

    Oder: Wie mache ich aus einem ostream einen stringstream, oder wie bekomme ich die bereits in einen ostream ausgegebenen Zeichen als String?



  • Erstmal sollte geklaert werden, wofuer der ostream von der Bibliothek gebraucht wird. Dort werden wahrscheinlich die Fehlermeldungen hineingeschrieben. Dann gibt es noch std::ostringstream, den man ohne das Problem zu kennen, benutzt werden kann. Fuer std::ostringstream gibt es bestimmt auch str(). http://www.cplusplus.com/reference/sstream/ostringstream/


  • Mod

    ahirsra schrieb:

    Wenn man so will könnte man sagen:
    Die Frage ist wie kann ich in diese Library einen ostream ausgeben!

    Du redest von schönem Design, aber die eigentliche Quelle des unschönen Designs ist doch, dass die log-Funktion einen stringstream entgegen nimmt. Es ist nur sehr schwer vorstellbar, dass diese Funktion wirklich einen stringstream braucht und nicht eher einen ostream oder gar string. Kann man da denn nichts machen? Extern heißt ja nicht unbedingt unantastbar. Der eigentliche Fehler liegt nämlich ziemlich sicher hier.

    Oder: Wie mache ich aus einem ostream einen stringstream, oder wie bekomme ich die bereits in einen ostream ausgegebenen Zeichen als String?

    Gar nicht, ein ostream enthält keine Zeichen. Ein ostream ist eine Sammlung von Schreibeoperationen verbunden mit einer Datensenke. Wenn die Daten erst einmal darin verschwunden sind, gibt es im allgemeinen kein Zurück. Ein stringstream ist eben eine Spezialisierung, wo die Datensenke ein string ist und man natürlich an diesen String kann. Aber man kann keinen allgemeinen ostream in einen spezialisierten stringstream umwandeln. Das wäre wie den Hund zum Dackel zu machen. Nein, eine noch verrücktere Umwandlung, da ein stringstream auch gleichzeitig noch ein istream ist. Das ist wie ein beliebiges Pferd in das Maultier "Hannes" umwandeln zu wollen, welches bei Bauer Jansen, Landstraße 27 in 12345 Faketown auf dem Hof steht.

    Folgender Code würde funktionieren, aber ich möchte das stringstring-Objekt aus Design- und Performancegründen im Aufruf selber verwenden!

    Performance? 😮 Wo läge denn hier deiner Meinung nach ein Performanceunterschied? Und wie kann man performancekritische Logfunktionen haben?

    Hier noch ein Vorschlag:

    log((ss << "test" << 1, ss));
    


  • ahirsra schrieb:

    extern void log(std::stringstream&);
    
    log(std::stringstream() << "test" << 1);
    

    Das funktioniert nicht weil versucht wird ein ostream zu übergeben;

    Versuch doch mal:

    std::stringstream foo;
    foo << "test" << 1;
    log(foo);
    

    Edit:
    Tschuldigung, sehe jetzt, dass Du das schon probiert hast. Ich verstehe aber nicht, wieso Du das nicht machen willst ...


Anmelden zum Antworten