2015-05-27 24 views
9

này tập ++ c ...Tại sao không có không gian tên được thêm vào cho hàm khi sử dụng chỉ thị không gian tên?

namespace foo { 
    class C { 
     void m(); 
    }; 
    void f(); 
} 

using namespace foo; 

void C::m() {} 
void f() {} 

..Compiles đến một tập tin đối tượng với các biểu tượng này:

$ g++ foo.cpp -c 
$ nm foo.o -C 
000000000000000a T f() 
0000000000000000 T foo::C::m() 

Tại sao C::m()? được không gian tên prepended, nhưng không f()?

(Tôi thay vì using namespace foo sử dụng namespace foo {...} thì cả hai tên đều có foo được thêm trước).

+0

Khi câu trả lời cho bạn thấy, không phát ban để chuyển đến kết luận khi viết câu hỏi. Nếu có điều gì đó đáng ngạc nhiên, tốt nhất là hãy cẩn thận trong cách bạn tiếp cận sự mâu thuẫn dường như và hỏi một cái gì đó như "Liên kết có khác nhau không?" thay vì giả định rằng nó (vì liên kết thực tế không liên quan gì tới tình huống của bạn; tất cả các liên kết liên quan đều ở bên ngoài). –

+1

@KerrekSB Tôi đã cập nhật tiêu đề để không đưa ra giả định về nguyên nhân. (Tất cả các quá thường xuyên tôi trộn lên liên kết, phạm vi và lưu trữ phân bổ khi giao dịch với C + +). –

+0

Được đánh giá cao! –

Trả lời

12

Trong void C::m() {}, C::m là tên đủ điều kiện và định nghĩa như vậy luôn đề cập đến nội dung được khai báo trước đây. Trình biên dịch ngước lên C, thấy rằng C thực sự là foo::C, nhờ vào sự sử dụng-chỉ, và phải mất void C::m(){} như định nghĩa của foo::C::m().

Khi bạn viết void f() {}, đó là tên không đủ tiêu chuẩn và luôn khai báo hàm trong không gian tên hiện tại, đó là không gian tên chung.

Các vấn đề liên quan