首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >重载运算符->

重载运算符->
EN

Stack Overflow用户
提问于 2011-02-04 17:07:54
回答 2查看 4.2K关注 0票数 18

下面是我的代码示例:

代码语言:javascript
复制
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 '.'
}

为什么编译器试图将运算符->的责任从Y移到X?当我实现X::op->时,我不能在那里返回X-编译错误表明“无限递归”,而从X::op->返回一些Z表明Z没有运算符->,从而在层次结构中越走越高。

有人能解释这种有趣的行为吗?:)

EN

回答 2

Stack Overflow用户

发布于 2011-02-04 17:15:38

因为这就是C++中重载->的工作方式。

使用重载->时,expression a->b将转换为a.operator->()->b。这意味着重载的运算符->必须返回本身支持运算符->的另一个应用程序的内容。由于这个原因,一个重载的->调用可能会变成一长串重载的->调用,直到它最终到达内置->的应用程序,从而结束这个链。

在本例中,您需要从过载的->返回X*,而不是X&

票数 19
EN

Stack Overflow用户

发布于 2011-02-04 17:47:57

您可能需要:

代码语言:javascript
复制
class Y : public X
{
public:
        X* operator->() { return this; }
        void f() {}
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4896238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档