[英]C++ overload operator '>>'
我一直在寻找很多不同的例子和解释,但没有一个真正回答我正在寻找的东西。 我有三个类,每个类都有一个名为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() ) );
(我知道这是简要说明,如果需要,我可以更好地解释)
所以,我试图重载运算符'>>'在main函数中有这样的东西:
foo >> bar >> baz;
对于它运行的第一个运算符,所以如果我只是执行以下操作,它可以正常工作:
foo >> bar.connect(baz.connect);
但是,当我设置另一个'>>'运算符时,g ++会返回此错误:
error: no match for ‘operator>>’ in ‘operator>>((* & foo), (* & bar)) >> baz.baz::connect()’
我想我没有正确地重载运算符'>>':
bar& operator>> (bar &br, baz &bz)
{
...
}
谢谢您的帮助 :)
操作员不是什么神奇的东西:它们只是以有趣的方式拼写的功能。 那就是你的陈述
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);
}
注意,使用operator>>()
您使用的最后一个connect()
是不可行的,因为运算符总是带两个参数。
虽然您没有显示它,但证据表明您的其他操作员是问题所在。 它看起来像这样:
foo& operator>>(foo&, bar&) { ... }
但为了使这个工作:
foo >> bar >> baz;
你可能希望foo >> bar
返回bar
(不是foo
),这样下次调用就是这个函数:
??? operator>>(bar&, baz&) { ... }
为了保持一致性,这可能应该返回baz&
,尽管在这种情况下并不是绝对必要的。
你拥有它的方式(因为foo >> bar
返回foo
),第二个operator>>
试图调用它(我假设不存在)函数:
??? operator>>(foo&, baz&) { ... }
您的重载运算符将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()
运行baz.connect()
,然后运行bar.connect()
,依此类推。 这与第一个例子相反。 这在您的应用程序中可能无关紧要,但需要考虑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.