我一直在查看很多不同的例子和解释,但没有一个真正回答我正在寻找的东西。我有三个类,每个类都有一个名为 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)
{
...
}
感谢您的帮助:)
答案 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()
,依此类推。这与第一个例子相反。这可能与您的申请无关,但需要考虑。