Stroustrup behauptet in seinem Buch was Falsches



  • In der 4. Auflage auf Seite 192, wo es um das Zusammensetzen von Namensbereichen geht, behauptet Bjarne Stroustrup (wie zum Teufel spricht man das eigentlich aus?), man könne Member von Namensbereichen nur dann definieren, wenn sie über ihren echten Namespace-Namen qualifiziert werden. Ok, ich zitier ihn lieber mal wortwörtlich:

    Namensbereiche: Nur wenn man etwas definieren möchte, muss man den richtigen Namensbereich der Entität kennen.

    Mööp! Stimmt nicht:

    namespace Aa {
    	void func();
    }
    
    namespace Bb {
    	using Aa::func;
    }
    
    //sollte laut ihm nur über Aa möglich sein.
    void Bb::func() { cout<<"geht aber auch durch Bb"; }
    

    Was sagt ihr dazu und warum wurde das in der 4. Auflage nicht korrigiert?



  • hast Du's im Standard nachgelesen oder hat das nur Dein Compiler durchgelassen?



  • Jetzt fällt es mir wie Schuppen von den Augen. Der Compiler von Microsoft in der Version 6.0 unterstützt den Standard ja gar nicht. Wie peinlich.

    Warum sollte da auch so ein offensichtlicher Fehler drin sein, den nur ich bemerke.



  • Jester schrieb:

    hast Du's im Standard nachgelesen oder hat das nur Dein Compiler durchgelassen?

    War zu faul es im standard zu suchen, aber würde ich echt nicht verstehen warum das erlaubt sein sollte.

    Denn using macht es ja nur sichtbar dort, es existiert aber nicht dort.

    Comeau bestätigt mich.

    btw: http://www.research.att.com/~bs/bs_faq.html#pronounce



  • Hallo,

    Shade Of Mine schrieb:

    War zu faul es im standard zu suchen, aber würde ich echt nicht verstehen warum das erlaubt sein sollte.
    Denn using macht es ja nur sichtbar dort, es existiert aber nicht dort.

    Full Ack!

    #include <iostream>
    
    namespace Aa {
        void func();
    }
    
    namespace Bb {
        using Aa::func;
    }
    
    void Bb::func()
    {
        std::cout << "func\n";
    }
    
    int main()
    {
        Bb::func();
    
        return 0;
    }
    

    Ausgabe gcc-3.3.4:

    gcc schrieb:

    foo.cpp:12: error: `void Bb::func()' should have been declared inside `Bb'
    foo.cpp: In function void Bb::func()': foo.cpp:12: error:void Bb::func()' conflicts with previous using declaration
    `void Aa::func()'

    Gruß



  • Hier mal was der aktuelle MSC dazu sagt

    error C2883: 'func' : function declaration conflicts with 'Aa::func' introduced by using-declaration
    error C2251: namespace 'Bb' does not have a member 'func' - Did you mean 'Aa::func'?


Anmelden zum Antworten