I namespace esistono per motivi lessicali.
In certi casi possono esistere funzioni con lo stesso nome ma di namespace diversi.
Se usi : using namespace std; ,
apri il namespace con tutte le sue funzioni e variabili , e nel caso esistano funzioni/variabili con lo stesso nome ma di namespace diversi , ti prendi l'errore.
Io preferisco usare la libreria senza aprire il namespace :
std::cout<<"ciao"; oppure std::string str;
Viene un po' piu' pulito.
Ciao.