Đ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?
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
@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ó) –
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. –