2012-04-19 24 views
5

Đ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ồ?

+5

Đọc về [ADL] (http://en.wikipedia.org/wiki/Argument-dependent_name_lookup), còn gọi là tra cứu Koenig. – ildjarn

+0

Trong gcc: http://ideone.com/G4uHo –

+0

Đ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

Trả lời

8

Đây là argument dependent lookup. Đối số cho bar nằm trong không gian tên foo, do đó, thanh cũng được tra cứu trong không gian tên đó, dẫn đến sự mơ hồ. Nếu bạn muốn gọi số foo từ không gian tên chung một cách rõ ràng, hãy gọi ::foo.

+0

Đúng, sử dụng toán tử "descoping": ':: bar()' để sửa lỗi này :) – Gui13

+0

@ Gui13 cảm ơn, tôi vừa thêm rằng – juanchopanza

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