trovato questo post utile altrove:
spazi dei nomi separati e organizzano la funzionalità. È possibile avere una funzione xander333::sort()
e non sarà in conflitto con std::sort()
o boost::sort()
o qualsiasi altro ordinamento(). Senza spazi dei nomi può esserci solo uno sort()
.
Ora diciamo che hai messo "using namespace std;" in tutti i tuoi file sorgente e hai implementato una semplice funzione basata su modelli chiamata fill()
nello spazio dei nomi globale di uno dei tuoi file. Questo file dipende anche da un'intestazione di libFoo - foo.hpp
. La versione 2.1 di libFoo viene fuori e all'improvviso il tuo programma non compila più. La tua versione di fill()
entra improvvisamente in conflitto con un'altra fill()
! Quello che è successo?
Si scopre che le persone che implementano libFoo sono incluse nella nuova versione di foo.hpp
quando non lo facevano prima. Ora hai tutti gli algoritmi standard inclusi nel tuo file sorgente e il tuo using namespace std;
li ha portati tutti nello spazio dei nomi globale. std::fill()
ora entra direttamente in conflitto con il tuo fill()
.
Più insidioso, il codice è stato compilato rinominando lo fill()
in xander333_fill()
, ma qualcosa non funziona correttamente - i numeri dei report sono disattivati. Si scopre che la funzione personalizzata divides()
, che esegue la matematica di precisione fissa, non viene più chiamata perché la funzione basata su modello (anch'essa inclusa di nuovo da foo.hpp
) consente una corrispondenza migliore perché i tipi di chiamata non corrispondono esattamente ai tipi dichiarati .
Discussione con la discussione rilevante è qui:
http://www.cplusplus.com/forum/unices/27805/
'using namespace std' è un errore di sintassi in' C'. Ma 'using',' namespace' e 'std' da soli sono identificatori perfettamente legali (anche se odiosi) che è possibile utilizzare nel codice. – pmg
@ pmg Nessuno ha mai parlato di C? – meagar
Usare "mi piace" in una frase del genere è male ... –