Nó không được phép đặt một namespace và một lớp có cùng tên vào một khu vực khai báo, ví dụ:tên mơ hồ tra cứu với việc sử dụng-chỉ
namespace A {}
class A{};
is ill-formed (thấy §3.3.1/4). Tuy nhiên, người ta có thể giới thiệu tên của một trong hai thông qua một chỉ thị sử dụng:
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?
Mã này có bị hỏng không? VC++ thinks so, cũng như 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;} } ^
Tuy nhiên, GCC accepts it.
Ai là đúng?
GCC chọn 'N :: A :: i'. Tự hỏi tại sao. – Barry
@Barry Tôi cũng bối rối, vì tôi mong đợi nó thích tuyên bố đó là hời hợt hơn, tức là "gần hơn" đến điểm tra cứu. – Columbo