C ++重载运算符'>>'

时间:2013-12-26 16:58:02

标签: c++ operators overloading definition

我一直在查看很多不同的例子和解释,但没有一个真正回答我正在寻找的东西。我有三个类,每个类都有一个名为 connect 的方法:

class foo { ... }
void foo::connect(bar br) { ... }

class bar { ... }
bar& bar::connect(baz bz) { ... }

class baz { ... }
baz& baz::connect() { ... }

在我的主要课程中,我将它们连接起来:

foo.connect(bar);
bar.connect(baz);
baz.connect();

或:

foo.connect( bar.connect( baz.connect() ) );

(我知道这是简要说明,如果需要,我可以更好地解释)

所以,我试图重载运算符'>>'在主函数中有这样的东西:

foo >> bar >> baz;

对于它运行的第一个运算符,所以如果我只是执行以下操作,它可以正常工作:

foo >> bar.connect(baz.connect);

但是,当我设置其他'>>'时operator g ++返回此错误:

error: no match for ‘operator>>’ in ‘operator>>((* & foo), (* & bar)) >> baz.baz::connect()’

我想我没有超载运营商'>>'正确:

bar& operator>> (bar &br, baz &bz)
{
  ...
}

感谢您的帮助:)

3 个答案:

答案 0 :(得分:5)

操作员不是什么神奇的东西:它们只是以有趣的方式拼写的功能。也就是你的陈述

foo >> bar >> baz;

实际上只是调用[或试图调用]

operator>> (operator>> (foo, bar), baz);

也就是说,你需要运营商

bar& operator>> (foo& f, bar& b) {
    f.connect(b);
    return b;
}
bar& operator>> (bar& b0, baz& b1) {
    return b0.connect(b1);
}

请注意,使用connect()时,您所拥有的最后一个operator>>()将无法使用,因为运算符始终采用两个参数。

答案 1 :(得分:2)

虽然您尚未展示,但有证据表明您的其他操作员是问题所在。它看起来像这样:

foo& operator>>(foo&, bar&) { ... }

但是为了让它起作用:

foo >> bar >> baz;

您可能希望foo >> bar返回bar(而不是foo),以便下次调用此功能:

??? operator>>(bar&, baz&) { ... }

为了保持一致性,这可能应该返回baz&,但在这种情况下并不是绝对必要的。

你拥有它的方式(因为foo >> bar返回foo),第二个operator>>试图调用它(我假设不存在)函数:

??? operator>>(foo&, baz&) { ... }

答案 2 :(得分:2)

您的重载运算符将bar&作为其左侧操作数,将baz&作为其右侧操作数,但您的示例代码为:

foo >> bar.connect(baz.connect);

左侧操作数为foo&,右侧操作数为bar&。您是否还定义了operator>>的另一个版本?

另请注意,引用示例代码,这个:

foo.connect(bar);
bar.connect(baz);
baz.connect();

与此不一样:

foo.connect( bar.connect( baz.connect() ) );

操作顺序不同;在第二个示例中,baz.connect()首先运行,然后运行bar.connect(),依此类推。这与第一个例子相反。这可能与您的申请无关,但需要考虑。