usando lo spazio dei nomi std; in un file di intestazione

Quindi, ho il seguente in un file di specifiche

#include  #include  using namespace std: class MyStuff { private: string name; fstream file; // other stuff public: void setName(string); } 

Ho anche nel file di implementazione

 #include "MyStuff.h" using namespace std; void MyStuff::setName(string name); { name = name } 

e nel file di programma ho …

 #include  #include  using namespace std; void main() { string name; MyStuff Stuff; cout << "Enter Your Name: "; getline(cin, name); Stuff.setName(name); } 

E sto raccogliendo che applicando “using namespace std;” in un file di intestazione è un no-no, e che per qualificarsi pienamente è la pratica “migliore”; come std::cout << stuff << endl;

Sono a conoscenza del fatto che per poter usare una stringa, deve avere lo spazio dei nomi std. È vero?

Se è così, nel file di intestazione, è più “puro / pulito” per farlo come …

 #include  class MyStuff { std::string name; } 

E, come capisco al momento, usando namespace std; attraverso tutti e tre i file, la specifica, l’implementazione e il programma, essenzialmente i tre spazi dei nomi si sovrappongono, quindi se decido separatamente il string name; all’interno di ciascuno dei file, il compilatore non saprà che cosa va a cosa. È vero?

Di solito capisco che essere chiari è una cosa “buona” da fare, tuttavia sono un po ‘oscuro sulla specificità di come, e sono più interessato al più profondo “perché” che è alla base di tutto.

Quindi la mia domanda diretta è, nel mio esempio fornito, qual è il modo “più chiaro” per descrivere la funzione sia per il compilatore che per lo “standard” di settore? E puoi indirizzarmi a risorse che delineano più chiaramente il ragionamento e l’implementazione pratica dei namespace.