use*_*855 18 c++ overloading operator-keyword
这是我的代码示例:
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 '.'
}
Run Code Online (Sandbox Code Playgroud)
为什么编译器试图将operator->的责任从Y移到X?当我实现X :: op->然后我不能返回X那里 - 编译错误说"无限递归",而从X :: op->返回一些Z再次说Z没有operator->,因此更高和等级越高.
谁能解释这个有趣的行为?:)
tem*_*def 19
问题是operator ->应该返回指针而不是引用.我们的想法是operator ->应该返回指向应该将指针应用于它的真实对象的指针.例如,对于具有重载的类operator ->,代码
myClass->myValue;
Run Code Online (Sandbox Code Playgroud)
翻译成
(myClass.operator-> ())->myValue;
Run Code Online (Sandbox Code Playgroud)
你的代码的问题是operator ->返回一个引用,所以写
myClass.operator->().f();
Run Code Online (Sandbox Code Playgroud)
是完全合法的,因为你明确地调用了运算符,但写作
myClass->f();
Run Code Online (Sandbox Code Playgroud)
是非法的,因为编译器正在尝试将其扩展为
myClass.operator->()->f();
Run Code Online (Sandbox Code Playgroud)
并且返回类型operator->不是指针.
要解决此问题,请更改代码,以便返回指针operator ->.如果要重载运算符以返回引用,则重载operator *; 指针引用应该确实产生引用.
AnT*_*AnT 19
因为这是->C++中重载的方式.
当您使用重载时->,表达式a->b被翻译成a.operator->()->b.这意味着您的重载运算符->必须返回一些本身支持另一个运算符应用程序的东西->.由于这个原因,单个重载调用->可能会转变为重载->s 的长链调用,直到它最终到达内置的应用程序->,从而结束链.
在你的情况下,你需要X*从你的重载返回->,而不是X&.