Newsgroup: it.comp.lang.c++
Titolo: Ancora sui namespace

Il comando "using namespace pippo" serve ad importare tutti gli
identificatori di pippo nel namespace globale, questo è chiaro, in modo da
evitare ogni volta di usare il risolutore di scope.
Tuttavia non capisco perchè in molti programmi, dopo aver importato gli
identificatori di std con il comando "using namespace std", si continui ad
usare "::", ad esempio con std::cout, std::cin. Non ho ancora studiato il
namespace std (cioè non so in particolare quali e quanti identificatori ci
sono dentro), ma se importo std nel namespace globale a che mi serve usare
ancora il risolutore di scope?

 ancora il risolutore di scope?
Non ti serve, a meno che non ci siano ambiguità. Ad ogni modo, importare
tutti gli identificatori di un namespace è una pratica sconsigliabile, che
di fatto vanifica il senso e l'utilità di avere spazi di nomi distinti.
Max

 di fatto vanifica il senso e l'utilità di avere spazi di nomi distinti.
Ma allora perchè circa 8 su 10 programmi che leggo abbastanza lunghi trovo
la direttiva "using namespace std"?

 wrote in message
news:8%U99.4917$L12.5...@news.edisontel.com...

Per molto tempo, diversi compilatori hanno continuato a gestire il namespace
del Libreria Standard in modo non conforme allo Standard: o perchè
iniettavano comunque tutti nomi della LS nel namespace globale, o perchè
trattavano 'std' come un alias per il namespace globale. Ci sono diversi
programmi in giro che sono stati scritti per quei compilatori e
successivamente resi standard mediante l'aggiunta di quel 'using'. In altri
casi, il programmatore è solo un po' "pigro" e vuole risparmiare qualche
battuta. Per quanto mi riguarda, io uso soltanto i seguenti
 using std::cerr;
 using std::cout;
 using std::endl;
di modo che le istruzioni di output siano un po' più "snelle".
Ad ogni modo, mentre il ricorso o meno a "using" nelle parti implementative
del codice potrebbe anche essere una questione di gusto o stile personale,
ciò che è assolutamente da evitare è adoperare "using" in un file header
pubblico per iniettare nel ns globale nomi della Libreria Standard.
Max

  using std::endl;
Non mi è chiaro solo questo punto...cioè, scusa, non faccio prima io che nei
programmi scrivo soltanto "cout", "cerr" e "cin", senza nessun risolutore di
scope?
Vuoi forse dire che è possibile trovare altri metodi o funzioni con questi
nomi, e quindi è meglio usare il risolutore per evitare confusione quando si
usano librerie?

 usano librerie?
Tutto è possibile!!!
E per evitare ambiguità si fa ricorso al risolutore di scope!
Ciao
Francesco

 nessun risolutore di scope?
Io credo che non ti sia chiaro a cosa serve l' "using".
Mettere quelle tre istruzioni serve appunto per poter scrivere nel
codice che segue "cout" al posto di "std::cout", "cerr" al posto
di "std::cerr" e "endl" al posto di "std::endl"
Scrivere "using namespace std;" fa lo stesso per ogni cosa inclusa
nel namespace std.
Perciò dopo quella istruzione potrai scrivere "cout" al posto di
"std::cout", "vector" al posto di "std::vector", "string" al posto di
"std::string", e così via...
Ovviamente in questo modo ti perdi il vantaggio di avere spazi di
nomi differenti, ovvero aumenti la probabilità di avere conflitti
di nome tra oggetti/funzioni.
Esattamente come facevo vedere in:
news:sre99.88902$
n04.2...@twister2.libero.it
--
Gerolamo

 usano librerie?
'cout' (così come 'cerr', 'cin', etc.) non è una keyword del linguaggio.
Possono esistere altri identificatori con quel nome all'esterno del
namespace 'std'.
Max

 viola lo Standard.
Perfetto, ora è tutto chiaro. Ti ringrazio.
Anthonyt