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

mak*_*day 4 c++ overloading definition operators

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

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

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

class baz { ... }
baz& baz::connect() { ... }
Run Code Online (Sandbox Code Playgroud)

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

foo.connect(bar);
bar.connect(baz);
baz.connect();
Run Code Online (Sandbox Code Playgroud)

要么:

foo.connect( bar.connect( baz.connect() ) );
Run Code Online (Sandbox Code Playgroud)

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

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

foo >> bar >> baz;
Run Code Online (Sandbox Code Playgroud)

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

foo >> bar.connect(baz.connect);
Run Code Online (Sandbox Code Playgroud)

但是,当我设置另一个'>>'运算符时,g ++会返回以下错误:

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

我想我没有正确地重载运算符'>>':

bar& operator>> (bar &br, baz &bz)
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助 :)

Die*_*ühl 5

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

foo >> bar >> baz;
Run Code Online (Sandbox Code Playgroud)

实际上只是打电话[或试图打电话]

operator>> (operator>> (foo, bar), baz);
Run Code Online (Sandbox Code Playgroud)

也就是说,你需要运营商

bar& operator>> (foo& f, bar& b) {
    f.connect(b);
    return b;
}
bar& operator>> (bar& b0, baz& b1) {
    return b0.connect(b1);
}
Run Code Online (Sandbox Code Playgroud)

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