2017-07-18 4 views
1

Ich möchte std::ostream wie folgt verwenden:Über std :: ostream Konstruktor

int main() 
{ 
    std::ostream os; 
    os << "something ..." << std::endl; 
    return 0; 
} 

Es ist ein Fehler, sagte, dass der Ostream Konstruktor geschützt:

error: ‘std::basic_ostream<_CharT, _Traits>::basic_ostream() [with _CharT = char; _Traits = std::char_traits]’ is protected.

Aber ich erinnere mich operator<< wie überlastet werden könnte, dies:

// In a class. 
friend std::ostream & operator<<(std::ostream& out, const String & s) { 
    out << s.m_s; 
    return out; 
} 

Irgendwelche Tipps, warum mein Code funktioniert nicht?

+1

Haben Sie eine '#include ' Präprozessordirektive? Ich glaube auch nicht, dass es einen parameterlosen 'ostream'-Konstruktor gibt - siehe [hier] (http://en.cppreference.com/w/cpp/io/basic_ostream/basic_ostream). 'ostreams sollten um einen stream buffer gewickelt werden - wolltest du stattdessen einen' fstream' oder ähnliches verwenden? – hnefatl

+0

Ja, ich habe eingeschlossen. Ich möchte std :: ostream wie im Fall des überladenen Operators <<() verwenden. Daher sollte der Konstruktor einen Strompuffer als Parameter haben? – Jaden

+0

Nein, ich meinte '#include '. Pre C++ 11, nur "iostream" eingeschlossen, reichte nicht immer aus, um "ostream" einzubinden (obwohl ich den SO-Post, der dies jetzt erklärt, nicht finden kann). Ja - Sie können nur ein 'ostream'-Objekt erstellen, wenn Sie ein' streambuf'-Objekt als Parameter übergeben. Dann wird der ostream in diesen Puffer ausgeben. Für eine einfache Erklärung siehe [diesen Beitrag] (http://www.cplusplus.com/forum/beginner/120947/). – hnefatl

Antwort

3

Die std::ostream, die std::istream oder std::iostream sind Basisklassen von Stromtypen (z.B. std::stringstream, std::fstream, etc.) in den Standard Library. Diese Klassen sind gegen Instanziierung geschützt, Sie können nur ihre abgeleiteten Klassen instanziieren. Die Fehlermeldung

error: 'std::basic_ostream<_CharT, _Traits>::basic_ostream() [with _CharT = char; _Traits = std::char_traits]' is protected

sagt Ihnen das gleiche.

Ihr zweites Beispiel ist gültig, weil Sie Verweise auf die Basisklasse abgeleiteter Klassen verwenden können. In diesem Fall wird kein Konstruktor aufgerufen, eine Referenz bezieht sich nur auf ein vorhandenes Objekt. Hier ist ein Beispiel, wie std::ostream& zum std::cout verwenden können:

#include <iostream> 

int main() { 
    std::ostream& os = std::cout; 
    os << "something ..." << std::endl; 
} 

Der Grund hinter der Verwendung std::ostream& in Überlastung von operator<< ist, dass Sie nicht über die die genannten Operator für alle einzelnen Stream-Typen zu überlasten wollen, aber nur für die gemeinsame Basisklasse von ihnen, die die << Funktionalität hat.

Verwandte Themen