2010-07-06 13 views
1

Quelqu'un a laissé entendre que faire cela dans un fichier d'en-tête n'est pas conseillé:Pourquoi ne devrais-je pas mettre "using namespace std" dans un en-tête?

using namespace std; 

Pourquoi est-il pas conseillé?

Se pourrait-il provoquer des erreurs de l'éditeur de liens comme celui-ci: (linewrapped pour plus de commodité)

error LNK2005: "public: __thiscall std::basic_string<char,struct 
std::char_traits<char>,class std::allocator<char> >:: 
~basic_string<char,struct std::char_traits<char>,class std::allocator<char> > 
(void)" ([email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]) 
already defined in tools.lib(Exception.obj) 
+0

Pas tout à fait un doublon: http://stackoverflow.com/questions/1265039/using-std-namespace –

+0

Je ne mets même pas dans mes fichiers .cpp. Je préfère utiliser 'std :: vector ' etc. –

Répondre

9

Parce qu'il oblige toute personne qui utilise votre fichier d'en-tête pour amener l'espace de noms std dans une portée globale. Cela peut être un problème s'ils ont une classe qui a le même nom que l'une des classes de bibliothèque standard.

1

Si le fichier est inclus ailleurs, l'unité de compilation obtiendra implicitement la directive using. Cela peut conduire à des erreurs de confusion lorsque les noms se chevauchent.

+0

pourrait-il provoquer des erreurs de liens comme ceci: erreur LNK2005: "public: __thiscall std :: basic_string , classe std :: allocateur >: : ~ basic_string , classe std :: allocateur > (void) "(?? 1? $ basic_string @ DU? $ char_traits @ D @ std @@ V? $ allocateur @ D @ 2 @@ std @@ QAE @ XZ) déjà défini dans tools.lib (Exception.obj) ?? –

+0

@Tony: Vous devez ajouter ceci à la question. Il serait plus facile de lire avec un formatage approprié. – pmr