这是我的代码示例:

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 '.'
}

为什么编译器试图将运算符(operator)->的责任“从Y移到X”?当我实现X::op->时,我不能在那里返回X-编译错误说“无限递归”,而从X::op->返回一些Z时又说Z没有运算符->,从而变得更高,并且等级较高。

谁能解释这个有趣的行为? :)

最佳答案

问题在于operator ->应该返回一个指针,而不是引用。这个想法是operator ->应该返回一个指向实际对象的指针,该对象应该应用该指针。例如,对于带有重载operator ->的类,该代码

myClass->myValue;

转换成
(myClass.operator-> ())->myValue;

您的代码的问题是operator ->返回了引用,因此编写
myClass.operator->().f();

是完全合法的,因为您明确调用了运算符,但是编写
myClass->f();

是非法的,因为编译器正在尝试将其扩展为
myClass.operator->()->f();

并且operator->的返回类型不是指针。

要解决此问题,请更改代码,以便在operator ->中返回一个指针。如果要重载运算符以返回引用,请重载operator *;指针取消引用确实应该产生引用。

关于c++ - 重载运算符->,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4896238/

10-11 22:39
查看更多