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.
stdist 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^^
-
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
aund danach vonbina. 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."
Obaundbnun 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 vonfoo. Deshalb müssen wir dem Kompiler explizit sagen, wo erbarfinden kann, nämlich im Scope vonfoo. Danach(2)sagen wir dem Kompiler erneut, dass es sich um die Funktionget_barim Scope vonfoohandelt. Der Scope der Funktions ist ein Childscope vomfooScope. Daher müssen wir nun dem Kompiler nicht mehr explizit angeben(3), wo erbarfinden kann. Dass der Rückgabewert vonget_barexplizit 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
structdurchnamespaceersetzen. 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; } }; };
-
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