Допустимо определять члены пространства имен вне их пространства имен, если их имя начинается с имени их пространства имен, а определение фактически происходит в пространстве имен, которое его охватывает. Это не может произойти в пространстве имен, которое вложено в пространство имен члена.
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!
}
}
Это то же самое, что и для членов класса, где вы также можете определять функции вне их класса, если вы добавляете имена к имени класса. Однако, что касается классов, члены пространства имен должны быть сначала объявлены в их соответствующем пространстве имен, прежде чем они могут быть определены вне его.