Не допускается помещать пространство имен и класс с одинаковым именем в одну декларативную область, т.е.
namespace A {}
class A{};
неверный формат (см. §3.3.1/4). Однако можно ввести имя любого из них с помощью директивы использования:
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 принимает его.
Кто прав?
N::A::i
. Интересно, почему. - person Barry   schedule 27.04.2015