Frage zu Beispiel aus C++ Primer zu Namespaces



  • Hallo, ich lerne gerade C++ mit dem C++ Primer (vierte Auflage von 2006). Dort steht zu Funktionssuche in Namespaces (S.845) folgendes:

    Funktionen einschließlich überladener Operatoren, die Parameter vom Klassentyp (bzw. Zeiger oder Referenzen auf einen solchen) übernehmen und im selben Namensbereich wie die Klasse selbst definiert werden, sind sichtbar, wenn ein Objekt vom Klassentyp (bzw. eine Referenz oder ein Zeiger auf einen solchen) als Argument verwendet wird.

    Als Beispiel ist dann das hier angegeben:

    std::string s;
    getline(std::cin, s); //O.K., Sucht getline auch in den Namensräumen, in denen cin und string definiert sind
    

    Aber was mich verwirrt: Dieses Beispiel sollte kompilieren, aber tut es bei mir nicht:

    #include <iostream>
    #include <string>
    
    int main()
    {
    	std::string s;
    	cin>>s; //Sollte eigentlich std::cin finden, da s in std:: definiert ist
    }
    

    Wenn ich das mit dem Visual Studio 2012 kompilieren will, bekomme ich die Meldung, dass cin nicht gefunden werden kann (wenn ich explizit std::cin schreibe, dann komiliert es).

    Verstehe ich die Stelle im Primer falsch oder hat sich an der Namensauflösung seitdem etwas geändert?



  • Nun, cin ist ja keine Funktion, mag das evtl. das Problem sein?



  • Ah, jetzt weiß ich wo der Fehler liegt:
    Der operator würde zwar gefunden (std::operator>>(std::cin, s) ), aber cin ist ja ein Objekt, weswegen dort std:: stehen muss. Ist das so richtig?



  • Nee, ich glaube auch der operator wurde nicht gefunden, weil der Compiler ja mit cin nichts anfangen kann. Aber er wird gefunden wenn man std::cin und std::string als Argumente angibt.



  • Ja so ähnlich wollte ich das auch sagen :>
    Gut, dann hab ichs jetzt verstanden. Danke



  • Hi,

    der Primer ist bei genauer Durchsicht voll von solch kleinen Fehlerchen. Das lädt aber zum Nachdenken und zur Selbsthilfe ein. Es bleibt dabei: extrem gutes und geradezu spannendes Lehrbuch!

    Überzeugt
    Pluto



  • Iskandr schrieb:

    Funktionen einschließlich überladener Operatoren, die Parameter vom Klassentyp (bzw. Zeiger oder Referenzen auf einen solchen) übernehmen und im selben Namensbereich wie die Klasse selbst definiert werden, sind sichtbar, wenn ein Objekt vom Klassentyp (bzw. eine Referenz oder ein Zeiger auf einen solchen) als Argument verwendet wird.

    Als erstes mal würde ich den Satz vereinfachen: Funktionen, die Parameter einer Klasse erwarten und im selben Namensbereich wie die Klasse selbst definiert sind, sind sichtbar, wenn eine Instanz dieser Klasse als Argument verwendet wird. (Argument-dependent name lookup)

    Also, um was geht es hier? Um Funktionen. Ist cin eine Funktion? Nein, es ist eine Instanz. Dennoch findet in deinem Beispiel ADL statt. Schreiben wir es mal um:

    #include <iostream>
    #include <string>
    
    int main()
    {
        std::string s;
    	operator>>( std::cin, s ); // operator>> wird ohne Angabe eines Qualifizierers gefunden. std::operator>> ist nicht notwendig.
    }
    

    Pluto schrieb:

    der Primer ist bei genauer Durchsicht voll von solch kleinen Fehlerchen. Das lädt aber zum Nachdenken und zur Selbsthilfe ein. Es bleibt dabei: extrem gutes und geradezu spannendes Lehrbuch!o

    Wo ist hier ein Fehlerchen?



  • Naja, der "Fehler" liegt daran, dass der Primer folgendes schreibt:

    Nehmen Sie das folgende Einfache Programm

    std::string s;
    cin >> s;

    Ohne diese Ausnahme von der Suchregeln müssten wir eine der beiden folgenden Zeilen schreiben:

    using std::operator>>;
    std::operator>>(std::cin, s);

    In dem Beispiel hat das cin kein std::, weshalb ich anfangs auch so verwirrt war 🙄


Anmelden zum Antworten