[C++] Trzy przestrzenie nazw o tej samej nazwie

Siema!

Mam pytanie odnośnie przestrzeni nazw. Otóż czego taki kod nie działa :?:

namespace aaa{aaa{aaa{ }

Dokładnie o to o czym mówi błąd. Nie wie o którą przestrzeń nazw chodzi.

Niczego się nie pozbyliśmy.

Jako iż aaa::aaa posiada aaa i jest “skopiowane” do przestrzeni głównej w której jest aaa to kompilator nie wie czy o aaa::aaa::aaa czy o aaa chodzi.

Gdyby tak było, to po czymś takim:

namespace aaa { int a; }

using namespace aaa;

nie moglibyśmy użyć aaa::a , a przecież możemy.

Dlatego też poprawnie (jednoznacznie) by było np.:

using namespace aaa::aaa::aaa;

using namespace aaa::aaa;

using namespace ::aaa;

lub

using namespace aaa;

using namespace ::aaa::aaa;

using namespace ::aaa::aaa::aaa;

itd. Dla formalności napisałem :wink: .

A czym się różni wobec tego aaa od ::aaa :?:

Akurat nie jestem w tych sprawach jakimś znawcą i biorę to raczej tak na chłopski rozum. Ja prefiksowanie nazw przez “::” tłumaczę sobie jako wyciągnięcie tej najbardziej zewnętrznej wersji nazwy. Działa to w różnych sytuacjach. I chyba mniej więcej tak jest - jeśli nie, prosiłbym o wyjaśnienie kogoś bardziej światłego :wink: .

::(operator zakresu) przed nazwą oznacza odwołanie się do globalnej(głównej) przestrzeni nazw.

Na MSDN jest wszystko ładnie opisane, tylko, że pod VC++, ale w tym przypadku GCC AFAIK zachowuje się tak samo.

Głównej czyli tej, od której wszystko się zaczęło tak :?: To dlaczego zamiast

using namespace aaa;using namespace ::aaa::aaa;using namespace ::aaa::aaa::aaa; [/code]



nie można napisać




[code=php]using namespace aaa;using namespace ::aaa::aaa;using namespace aaa::aaa::aaa; 



1 linijka to przeniesienie do Global scope przestrzeni aaa::aaa. Druga linijka gdyby była na początku bez :: to rzeczywiście mogły by być problemy. No ale trzecia ? Wytłymaczy mi ktos jak to mozliwe, że jest konflikt tutaj bez wstawienia operatora :: :?:

Występuje tam błąd ponieważ kompilator nie wie czy pierwsze “aaa”(mówię o ostatniej linijce) odnosi się do “aaa”, “aaa::aaa”, czy “aaa::aaa::aaa”.

Czyli kompilator nie wyklucza pierwsze niektórych przestrzeni ze względu na ich zawartość :?: Bo np. aaa::aaa::aaa nie może odnosić się do aaa::** aaa** bo ta przestrzeń ma w sobie zagnieżdżone tylko jedno “aaa”, a nie dwa. (Już o aaa::aaa::aaa nie wspominając). Bo jak tak jest to już rozumiem :?:

Nie, kompilator nie sprawdza co dana przestrzeń zawiera.