2013-07-25 25 views
5

Điều này làm tôi ngạc nhiên. Đây hoạt động:C++ chức năng người bạn nội tuyến có cùng tên với biến thành viên

struct foo { 
    int x; 
    friend int x(foo f) { return f.x; } 
    friend int y(foo f); 
}; 

int y(foo f) { return x(f); } // no problem 

Nhưng đây là một lỗi:

struct foo { 
    int x; 
    friend int x(foo f) { return f.x; } 
    friend int y(foo f) { return x(f); } // error: invalid use of foo::x data member 
}; 

Tại sao không phải cả hai (dis) cho phép?

+1

Có 'return :: x (f);' hoạt động không? Điều đó nên tham chiếu rõ ràng 'x()' trong không gian tên chung. (Nếu 'x()' không có trong không gian tên chung thì hãy thử ':: the :: namespace :: x (f)'.) – cdhowie

+0

@cdhowie: "Tên của người bạn ** không được tìm thấy ** bởi không đủ tiêu chuẩn tra cứu ** hoặc bằng tra cứu đủ điều kiện ** cho đến khi một khai báo phù hợp được cung cấp trong phạm vi không gian tên đó ". Tra cứu phụ thuộc vào đối tượng là cách duy nhất để tìm kiếm nó, hoặc thêm một khai báo trên lớp (vì dưới lớp quá muộn để khai báo nội dòng 'friend int y()' để tìm nó) –

+1

Loại quy ước đặt tên nào dẫn đến cho một biến thành viên và một hàm bạn bè để chia sẻ một tên? Đó là vấn đề bạn thực sự cần phải giải quyết. –

Trả lời

3
Lý do là trong trường hợp đầu tiên, tình bạn đã tiêm khai báo hàm vào không gian tên bao quanh, do đó cuộc gọi toàn cầu phạm vi đến x chỉ có thể xem một x.

Trong ví dụ thứ hai, xhai ý nghĩa ở phạm vi đó: Chức năng người bạn chung và biến (có lẽ là đổ bóng chức năng người bạn chung).

+2

Theo http://stackoverflow.com/a/8284809/103167, không bạn không thể gọi nó là ':: x (f)'. –

+1

Ben là chính xác, trừ khi bạn cũng cung cấp một tuyên bố ở cấp không gian tên bạn chỉ có thể tiếp cận chức năng của bạn bè thông qua ADL. –

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