[ grabber @ 13.10.2011. 21:47 ] @
Pozdrav

Imam malu konfuziju oko rada sa namespace-om. O čemu se radi? Ukoliko napravim neki svoj namespace i u njemu definišem recimo jednu varijablu tipa int. i kada u main funkciji uključim cijeli taj namespace, i napravim varijablu koja se zove isto kao ta pomenuta koju sam napravio unutar namespacea, ne javlja nikakvu grešku i uredno ga kompajlira. Međutim ako umjesto uključivanje kompletnog tog namespace, uključim samo tu varijablu iz pomenutog namespacea, dobijem grešku prilikom kompajliranja. Evo na primjeru konkretno. Ovo radi bez greške pri kompajliranju:

Code:
#include <iostream>

namespace a
{
    int m=5;
}

int main()
{
    int m=10;
    using namespace a;
    std::cout<<m<<std::endl;
    return 0;
}


A ovo izbaci grešku "m is already declared in this scope":
Code:
#include <iostream>

namespace a
{
    int m=5;
}

int main()
{
    int m=10;
    using a::m;
    std::cout<<m<<std::endl;
    return 0;
}


Zar uključivanje kompletnog namespacea nije "jače" od uključivanja objekata pojedinačno, tj zar se ne uradi isto ovo i kad uključim cijeli namespace + što bi se uključile i još neke definicije da ih je bilo unutar tog namespacea?
[ Mihajlo Cvetanović @ 14.10.2011. 10:41 ] @
Ono što ti želiš da uradiš (da prekriješ jedno ime istim imenom iz drugog namespace-a) ne spada u ispravan rad sa C++ jezikom.

Namespace nije napravljen s namerom da se prekrivaju promenljive koje nisu u namespace-u. Namespace služi da nemaš problema kad koristiš dve različite biblioteke od dva različita proizvođača. Ako proizvođači odaberu jedinstvena imena za svoje namespace-ove onda možeš da koristiš njihove biblioteke bez bojazni da se kod neće ni kompajlirati zbog konflikta imena. Using direktiva "using namespace xxx" je samo olakšica za rad sa starim kodom, da ne bi morao da masovno menjaš kod samo da bi se kompajlirao. Preporuka je da u novom kodu svuda koristiš ili puno ime, xxx::šta_god, ili using deklaraciju "using xxx::šta_god". Using deklaracija je korisno rešenje, jer te oslobađa obaveze da dodaješ xxx svaki put kad koristiš šta_god, a istovremeno ne dolazi do preklapanja imena. Možeš naravno da koristiš i using direktivu, ali onda moraš da vodiš računa da tada ne dođe do problema koji upravo imaš. Preklapanje imena nije poželjno.
[ grabber @ 14.10.2011. 11:08 ] @
Razumijem to, ali me prvenstveno zanima ovdje u kodu koja je razlika ako idem using xxx:aa; i using namespace xxx;

Znači, zanima me zar on ne "prekopira" sve definicije iz određenog namespacea kada koristim drugi slučaj, pa samim tim uključen je i objekat aa kojeg ne dozvoljava samog uključiti.
[ grabber @ 14.10.2011. 11:49 ] @
edit: mislim da sam razumio, direktiva napravi raspoloživim sve definicije i objekte iz namespacea u scopeu u kojem je napisana - NE DEKLARIŠE NIŠTA, a deklaracija na tom mjestu deklariše funkciju/klasu/objekat, pa to stvara konflikt.