Tôi không thể hiểu tại sao đoạn mã này không biên dịch:Namespace đụng độ trong C++
namespace A {
class F {}; // line 2
class H : public F {};
}
namespace B {
void F(A::H x); // line 7
void G(A::H x) {
F(x); // line 9
}
}
Tôi đang sử dụng gcc 4.3.3
, và lỗi này là:
s3.cpp: In function ‘void B::G(A::H)’:
s3.cpp:2: error: ‘class A::F’ is not a function,
s3.cpp:7: error: conflict with ‘void B::F(A::H)’
s3.cpp:9: error: in call to ‘F’
Tôi nghĩ rằng bởi vì trong dòng 9 không có tiền tố không gian tên, F(x)
chỉ có nghĩa là B::F(x)
. Trình biên dịch cố gắng để đúc x
vào lớp cha của chính nó. Theo hiểu biết của tôi thì không nên. Tại sao nó làm điều đó?
Cái gọi là tra cứu Koenig, trên thực tế, được mô tả trong phần 3.4.2 của tiêu chuẩn C++. –
Sau đó, nếu VS biên dịch, đó là lỗi? – liori
Bạn có thể tìm thấy tham chiếu đến tuyên bố đó không? Tôi chưa bao giờ nghe về bất kỳ quy tắc nào như vậy ... – xtofl