2015-04-26 13 views
8

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?

+0

GCC chọn 'N :: A :: i'. Tự hỏi tại sao. – Barry

+0

@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

Trả lời

6

Mã không đúng định dạng. Khi nhìn lên A, §7.3.4/6 bước trong:

Nếu tra cứu tên tìm thấy một tuyên bố cho một tên trong hai không gian tên khác nhau, và tờ khai không khai báo cùng một thực thể và làm không khai báo chức năng , việc sử dụng tên là không đúng định dạng.

Ở đây, không gian tên là namespace toàn cục và N, và các đối tượng là những namespace N::A và lớp ::A.