Siema!
Mam pytanie odnośnie przestrzeni nazw. Otóż czego taki kod nie działa :?:
namespace aaa{aaa{aaa{ }
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 .
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 .
::(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.