Не допускается помещать пространство имен и класс с одинаковым именем в одну декларативную область, т.е.
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 ++ так думает, так же как лязг:
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 принимает это.
Кто прав?
Код плохо сформирован. При поиске A
§7.3.4 / 6 шагов в:
Если поиск имени находит объявление для имени в двух разных
пространства имен и объявления не объявляют одну и ту же сущность и делают
Не объявляйте функции, использование имени является неправильным.
Здесь пространства имен являются глобальным пространством имен и N
и сущности являются пространством имен N::A
и класс ::A
,