名前空間メンバーは、宣言の名前空間を囲む名前空間で定義できます。
名前付き名前空間のメンバーは、定義されている名前の明示的な修飾 (3.4.3.2) によってその名前空間の外部で定義することもできます。ただし、定義されているエンティティが名前空間で既に宣言されており、その定義が名前空間の宣言ポイントの後にある場合に限ります。宣言の名前空間を囲みます。
void f();
namespace N { void ::f() {} } // illegal for definition
namespace N { void ::f(); } // what about redeclaration?
クラスは、宣言の名前空間を囲む名前空間で定義できます。
class-head-name に nested-name-specifier が含まれる場合、class-specifier は、nested-name-specifier が参照するクラスまたは名前空間、またはその名前空間のインライン名前空間セット (7.3.1) (つまり、単に using 宣言によって継承または導入されたものではない) であり、class-specifier は、前の宣言を囲む名前空間に現れるものとします。そのような場合、定義のクラスヘッド名のネストされた名前指定子は、decltype 指定子で始まってはなりません。
struct A;
namespace N { struct ::A {}; } // illegal for definition
namespace N { struct ::A; } // what about redeclaration?
また、メンバー関数の定義と静的データ メンバーの定義にも同じ規則があります。
私の質問は、元の宣言を囲まない名前空間で再宣言 (定義ではない) が合法かどうかです。