Dưới đây là ví dụ mã của tôi:quá tải toán tử ->
class X
{
public:
void f() {}
};
class Y : public X
{
public:
X& operator->() { return *this; }
void f() {}
};
int main()
{
Y t;
t.operator->().f(); // OK
t->f(); // error C2819: type 'X' does not have an overloaded member 'operator ->'
// error C2232: '->Y::f' : left operand has 'class' type, use '.'
}
Tại sao trình biên dịch đang cố gắng để "di chuyển trách nhiệm" đối với nhà khai thác> từ Y đến X? Khi tôi thực hiện X :: op-> sau đó tôi không thể trả về X ở đó - lỗi biên dịch nói "đệ quy vô hạn" trong khi trả về một số Z từ X :: op-> một lần nữa nói rằng Z không có toán tử->, do đó sẽ cao hơn và cao hơn trong phân cấp.
Có ai có thể giải thích hành vi thú vị này không? :)
Tôi sẽ không nói nó giả sử để trả về một con trỏ, chỉ là bất cứ điều gì nó sẽ trả về nhu cầu để hỗ trợ 'nhà khai thác> '. – GManNickG
@ GMan- Điểm tốt. Tôi đã đi cho sự đơn giản ở đây, nhưng bạn là chính xác. Có một số thủ thuật thực sự thú vị mà bạn có thể kéo ra bằng con trỏ thông minh dựa vào kỹ thuật này. – templatetypedef
@GMan: Vì các kiểu như vậy được gọi chung là * con trỏ thông minh *, tôi không nghĩ templatetypedef là sai khi sử dụng thuật ngữ * con trỏ *, anh ấy chỉ sử dụng nó theo nghĩa chung. –