namespace



  • Hi,

    kann mir jemand sagen wie ich das mit den namespaces handeln kann?
    Der Comipler gibt mir die Fehlermeldung aus er würde a:🅱:std nicht kennen,
    was richtig ist. Nur würde ich jetzt gerne wissen, wie std:: benutzten kann.
    Eine Lösung wäre "using namespace a::b;" aber davon wird ja immer abgeraten.
    Oder kennt noch einer eine Lösung^^

    Danke schon mal 😉

    File A.cpp:
    
       #include "A.hpp"
       #include <iostream>
    
       namespace a {
          namespace b {
    
             void function() {
                std::cout << "Help somebody^^!" << std::endl;
             }
    
          };
       };
    


  • In dem Code Stück sehe ich kein Problem.
    std ist kein Namensraum in a::b, aber das machst du in dem gezeigten Code ja auch überhaupt nicht.. 😕

    btw:
    Namensraumdefinitionen brauchen kein beendendes Semikolon.



  • Teste mal dies:

    File A.cpp:
    
       #include "A.hpp"
       #include <iostream>
    
       void a::b::function() {
          std::cout << "Help somebody^^!" << std::endl;
       }
    


  • Würde der Compiler bei dieser Konstellation nicht davon ausgehen, dass a:: bzw. b:: eine Klasse sind?

    Gruß



  • Was ist der Inhalt von A.hpp?



  • Hauptsache, alle reden aneinander vorbei... 😃



  • Nexus schrieb:

    Hauptsache, alle reden aneinander vorbei... 😃

    👍

    Es gibt nichts schöneres, als Verwirrtheit am Sonntag Nachmittag. :p



  • Ok ich habe das Problem gelöst^^. Es war mein Fehler. Als ich die .cpp geschrieben habe, hab ich zum testen mitten drin iostream inkludiert. Und später nicht über den namepace verschoben, deshalb der kurriose Fehler. 😃 Aber danke für Eure Hilfe^^


  • Administrator

    theliquidwave schrieb:

    Würde der Compiler bei dieser Konstellation nicht davon ausgehen, dass a:: bzw. b:: eine Klasse sind?

    Nein. Der Scope-Operator wechselt einfach in den entsprechenden Scope von a und danach von b in a . Die Anweisung sagt somit nichts anderes aus als: "Lieber Kompiler, suche im aktuellen Scope einen Scope mit dem Namen a. Im Scope von a solltest du einen weiteren Scope mit dem Namen b haben. Wähle diesen Scope b in a für mich aus."
    Ob a und b nun Klassen oder einen Namensraum darstellen ist irrelevant. Beide haben aber einen Scope.

    Dass es auch bei der Klasse um einen Scope handelt, merkst du bei solchen Konstrukten:

    struct foo
    {
      typedef int bar;
    
      bar get_bar();
    };
    
    /*(1)*/ foo::bar foo::get_bar() /*(2)*/
    {
      return bar(); /*(3)*/
    }
    

    Bei (1) sind wir ausserhalb des Scopes von foo . Deshalb müssen wir dem Kompiler explizit sagen, wo er bar finden kann, nämlich im Scope von foo . Danach (2) sagen wir dem Kompiler erneut, dass es sich um die Funktion get_bar im Scope von foo handelt. Der Scope der Funktions ist ein Childscope vom foo Scope. Daher müssen wir nun dem Kompiler nicht mehr explizit angeben (3) , wo er bar finden kann. Dass der Rückgabewert von get_bar explizit angeben werden musse, kann gerade bei Funktionstemplates sehr mühsam sein. Mit C++0x wird es dafür aber Abhilfe geben:

    auto foo::get_bar() -> bar // hier sind wir bereits im Scope der Funktion, somit ist bar bekannt.
    {
      // ...
    }
    

    Du kannst übrigens bei diesem Beispiel struct durch namespace ersetzen. Der Kompiler wird keinen Unterschied feststellen.

    Grüssli



  • Hmm, der g++ und auch der msvc meckern bei dem Konstrukt vom TE nicht rum.
    Aber so sollte es eigentlich auch gehen:

    namespace a {
          namespace b {
    
             void function() {
                ::std::cout << "Help somebody^^!" << std::endl;
             }
    
          };
       };
    

  • Administrator

    Scorcher24 schrieb:

    Hmm, der g++ und auch der msvc meckern bei dem Konstrukt vom TE nicht rum.

    Der TE hat ja schon gesagt, wieso es bei ihm nicht funktioniert hat:

    namespaceProblem schrieb:

    Ok ich habe das Problem gelöst^^. Es war mein Fehler. Als ich die .cpp geschrieben habe, hab ich zum testen mitten drin iostream inkludiert. Und später nicht über den namepace verschoben, deshalb der kurriose Fehler. 😃 Aber danke für Eure Hilfe^^

    Grüssli


Anmelden zum Antworten