同じ名前の名前空間とクラスを 1 つの宣言領域に入れることは許可されていません。
namespace A {}
class A{};
形式が正しくありません (§3.3.1 /4 を参照)。ただし、using ディレクティブを介していずれかの名前を導入できます。
namespace N { namespace A {int i;} }
struct A {static int i;};
using namespace N;
int i = A::i; // The global struct, or namespace N::A?
このコードは形式が正しくありませんか? VC++はClangと同様にそう考えています:
main.cpp:7:9: error: reference to 'A' is ambiguous int i = A::i; ^ main.cpp:3:8: note: candidate found by name lookup is 'A' struct A {static int i;}; ^ main.cpp:1:25: note: candidate found by name lookup is 'N::A' namespace N { namespace A {int i;} } ^
ただし、GCC はそれを受け入れます。
誰が正しいですか?