Điều này đã gây nhầm lẫn cho tôi và một vài đồng nghiệp, nhưng chúng tôi đã xác minh đây là lỗi đối với khoảng 5 trình biên dịch khác nhau. Tất cả đều trả lại đoạn mã nhỏ này là "mơ hồ".C++ gọi hàm ý trong các không gian tên khác nhau
namespace foo {
struct type_t {
int x;
};
void bar(type_t &);
}
void bar(foo::type_t &);
void func(void) {
foo::type_t x = { 10 };
bar(x);
}
Clang trả về như sau:
func.cpp:12:3: error: call to 'bar' is ambiguous
bar(x);
^~~
func.cpp:5:8: note: candidate function
void bar(type_t &);
^
func.cpp:8:6: note: candidate function
void bar(foo::type_t &);
^
1 error generated.
Tại sao điều này xảy ra? Không có câu lệnh "sử dụng" trong mã. Thứ tự phân giải không nên bao gồm không gian tên foo, vậy tại sao nó lại tìm kiếm ở đó? Tại sao điều này mơ hồ?
Đọc về [ADL] (http://en.wikipedia.org/wiki/Argument-dependent_name_lookup), còn gọi là tra cứu Koenig. – ildjarn
Trong gcc: http://ideone.com/G4uHo –
Điều này dường như không phải là lỗi của trình biên dịch. Các lỗi tương tự được tạo ra bởi g ++, HP C++ và Comeau. – daxelrod