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.
De quelle façon est plus idiomatique? – Philipp
@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. –
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