这是我的代码示例:
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/