2010-07-09 5 views
2

Peut-on utiliser des espaces de nommage comme dans l'extrait ci-dessous? Le code compile à la fois dans gcc et msvc, me laissant confus au sujet de l'utilisation de l'espace de noms.Utilisation des espaces de noms en C++

En f1.h:

 
namespace My 
{ 
void foo(); 
} 

Dans f1.cpp `

 
void My::foo() 
{ 
} 

Je pensais que la fonction doit être définie comme:

 
namespace My { 
void foo() {} 
} 

Quelqu'un peut-il aimablement expliquer n?

Merci

Répondre

8

Il est légal de définir des membres d'espaces de noms en dehors de leur espace de noms tant que leur nom est précédé du nom de leur espace de noms, et la définition se produit réellement dans un espace de noms qui l'entoure. Cela ne peut pas se produire dans un espace de noms imbriqué dans l'espace de noms des membres.

namespace A { void f(); } 
void A::f() { } // prefix with "A::" 

namespace B { } 
void B::f() { } // invalid! not declared in B! 

namespace C { void f(); } 
namespace D { void C::f() { } } // invalid! D doesn't enclose C 

namespace E { 
    void f(); 
    namespace F { 
    void E::f() { } // invalid! F is nested inside E! 
    } 
} 

C'est la même chose que pour les membres de la classe, où vous pouvez également définir des fonctions en dehors de leur classe, aussi longtemps que vous préfixe les noms avec le nom de la classe. Cependant, comme pour les classes, les membres de l'espace de noms doivent d'abord être déclarés dans leur espace de noms respectif avant de pouvoir être définis en dehors de celui-ci.

+0

De quelle façon est plus idiomatique? – Philipp

+0

@Philipp je définis les fonctions en ligne directement en place, et d'autres fonctions séparément. Surtout s'il y a une séparation en-tête/fichier d'implémentation. –

+0

N'est-ce pas une tautologie? Les fonctions définies dans la définition de la classe sont toujours en ligne. Je voulais dire s'il fallait définir des fonctions autonomes en utilisant 'A :: f' ou' namespace A {f} '. Au moins Boost semble préférer le dernier. – Philipp

0

Oui c'est très bien. En faisant le "Mon ::" vous indiquez que vous utilisez l'espace de noms "Mon".

De la même façon que vous pouvez déclarer un vecteur STL comme "std :: vector < int>" ...

0

deux est vrai

vous pouvez définir l'espace globalement ou pour chaque fonction

namespace My { 
//in this are functions are in "My" namespace 
} 

namespace Your { 
//in this are functions are in "Your" namespace 
} 

My::foo() {} 
My::bar() {} 
Your::foo() {} 

si vous ne voulez pas écrire "Mon ::" au début de chaque fonction, yo tu l'écris en premier. le second est utile quand il y a plus d'un espace de noms

0

C'est la même chose que de faire: utiliser un espace de noms std; sur le dessus et juste faire cout au lieu de faire std :: cout. Les deux fonctionneront et les deux sont valides, mais vous devez penser à la façon de les utiliser. Il y a des avantages et des inconvénients.

0

J'aime que cela est permis:

namespace My 
{ 
void foo(); 
} 

Comme cela signifie que si une méthode utilitaire est assez long, il ne pas encombrer le fichier d'en-tête. De cette façon, il est plus évident quelles méthodes sont fournies dans l'espace de noms.

Je sais que cela peut être un point zéro avec l'expressivité des IDE modernes, mais il est toujours utile d'avoir des fichiers d'en-tête propres.

Questions connexes