8

同じ名前の名前空間とクラスを 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 はそれを受け入れます

誰が正しいですか?

4

1 に答える 1

8

コードの形式が正しくありません。を検索するAと、§7.3.4/6 の手順:

名前検索で 2 つの異なる名前空間で名前の宣言が検出され、宣言が同じエンティティを宣言せず、関数も宣言されていない場合、その名前の使用は不適切です。

ここで、名前空間はグローバル名前空間とNであり、エンティティは名前空間N::Aとクラス::Aです。

于 2015-04-26T21:48:22.390 に答える