iostream reicht nicht für std::cout



  • @Bashar: check ich nicht? 😕 sorry, aber was soll mir das sagen? Ich habe mir einfach die Dateien iostream.h und iostream.cpp angeschaut, um zu sehen wo cout angelegt wird und so bin ich auf die Deklaration gestoßen. stimmt was an meiner Aussage nicht? thanx'
    'n please remember: freshman's still a rookie



  • In der aktuellen Standardlibrary (C++98) ist iostream keine Klasse, sondern ein typedef auf ein Template. Das gilt auch für die anderen Streams. Wenn du dich für die Implementierung der aktuellen Standardlibrary interessierst, solltest du in einen der neuen Header gucken ... ostream, istream ... die Header mit .h sind veraltet.

    Deine Aussage ist ansonsten richtig, es ging ja auch um cout und nicht um iostream.



  • Bashar schrieb:

    die Header mit .h sind veraltet

    das wußte ich, deshalb habe ich mich auch so gewundert, daß ich nur in den alten Headredateien die Deklaration gefunden habe und nicht in der iostream (benutze MS VS 6.0). Wo genau steht denn das typedef?



  • Das hat doch jetzt aber nichts mit der Frage zu tun, er wollte nur wissen, wieso es keine ostream(.h) gibt! 😉
    Und die gibt es nun mal einfach nicht, wäre sonst wohl etwas zu umständlich. 😃

    MfG RoaN;



  • roan312 schrieb:

    Das hat doch jetzt aber nichts mit der Frage zu tun, er wollte nur wissen, wieso es keine ostream(.h) gibt! 😉
    Und die gibt es nun mal einfach nicht, wäre sonst wohl etwas zu umständlich. 😃

    Das stimmt nicht. Es gibt sowohl eine <istream> als auch eine <ostream> Include-Datei.

    Edit: Ein Blick auf die Platte in's Standard-Include-Verzeichnis hätte dir das auch gezeigt. 😉



  • freshman: Frag mich bitte nicht, wie genau das in der iostream landet. Es gibt diese typedefs in der <iosfwd>, aber ich hab in der mir zur Verfügung stehenden Zeit nicht herausfinden können, ob und falls ja, über welche verschlungenen Pfade diese letztlich in der <iostream> landet. Wenn du dir <ostream> oder <istream> anguckst, wirst du aber feststellen, dass dort nur Templates deklariert werden.



  • PuppetMaster2k schrieb:

    roan312 schrieb:

    Das hat doch jetzt aber nichts mit der Frage zu tun, er wollte nur wissen, wieso es keine ostream(.h) gibt! 😉
    Und die gibt es nun mal einfach nicht, wäre sonst wohl etwas zu umständlich. 😃

    Das stimmt nicht. Es gibt sowohl eine <istream> als auch eine <ostream> Include-Datei.

    Edit: Ein Blick auf die Platte in's Standard-Include-Verzeichnis hätte dir das auch gezeigt. 😉

    Oh, 🙄
    Da is was dran...

    MfG RoaN;



  • Wenn die MSDN die Wahrheit spricht, wird basic_iostream auch gar nicht in <iostream>, sondern in <istream> definiert.

    Soweit ich das verstanden habe, ist <ostream> grob gesagt für basic_ostream und alle entsprechenden op<< da, <istream> für basic_istream und basic_iostream und alle entsprechenden op>> und <iostream> nur für die vordefinierten Streamobjekte (z.B. cout). Deshalb reicht <iostream>, damit man cout überhaupt sieht.

    Es ist aber vielmehr eher so, dass man <ostream> meistens *zusätzlich* einbinden muss, wenn man z.B. Zeichenfolgen ausgeben will. Die meisten Hello Worlds sind in dem Punkt unvollständig.



  • operator void schrieb:

    Es ist aber vielmehr eher so, dass man <ostream> meistens *zusätzlich* einbinden muss, wenn man z.B. Zeichenfolgen ausgeben will. Die meisten Hello Worlds sind in dem Punkt unvollständig.

    Ich glaub da hab ich etwas nicht verstanden oder du liegst falsch.
    Man muss doch nicht die <ostream>

    #include
    

    'n um ein Char[] auszugeben!
    Wie meinst du das?

    MfG RoaN;



  • roan312 schrieb:

    Ich glaub da hab ich etwas nicht verstanden oder du liegst falsch.
    Man muss doch nicht die <ostream> #include'n um ein Char[] auszugeben!

    Doch das ist schon richtig so. In iostream müssen eigentlich nur die Standardstream-Objekte deklariert werden. Dazu müssen natürlich ihre Typen bekannt sein, d.h. die Klassentemplates basic_ostream usw. sind auch sichtbar, die typedefs für ostream etc. auch. Das kann man als Library-Implementierer ziemlich einfach erreichen, indem man in iostream die ostream und istream inkludiert ... muss man aber nicht. Dann fehlen u.U. die freien << Operatoren u.a. für die Stringausgabe.

    Das ist offensichtlich recht theoretisch und ein Fehler im Standard, aber definiert ist es trotzdem so 🙂


Anmelden zum Antworten