关于c ++:<<操作符重载

operator<< overloading

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Operator overloading

我在这个问题上找不到任何能帮助我的东西…我正试图超载<< operator,这是我的代码:

1
2
3
4
 ostream& Complex::operator<<(ostream& out,const Complex& b){
    out<<"("<<b.x<<","<<b.y<<")";
    return out;
}

这是H文件中的声明:

1
 ostream& operator<<(ostream& out,const Complex& b);

我得到这个错误:error: std::ostream& Complex::operator<<(std::ostream&, const Complex&) must take exactly one argument

什么?为什么我做错了?谢谢


你的operator <<应该是自由功能,而不是你的Complex类成员。

如果你做了你的operator <<类成员,它实际上应该取一个参数,应该是stream。但是这样你就不能像

1
std::cout << complex_number;

但是

1
complex_number << std::cout;

相当于

1
complex_number. operator << (std::cout);

正如您可以注意到的,这不是常见的实践,这就是为什么operator <<通常被定义为自由函数的原因。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Complex
{
    int a, b;
public:
    Complex(int m, int d)
    {
        a = m; b = d;
    }
    friend ostream& operator<<(ostream& os, const Complex& complex);
};

ostream& operator<<(ostream& os, const Complex& complex)
{
    os << complex.a << '+' << complex.b << 'i';
    return os;
}

int main()
{
    Complex complex(5, 6);
    cout << complex;
}

更多信息在这里


如前所述,流重载需要是在类外部定义的自由函数。

就我个人而言,我更喜欢远离friend船,转而转向公共成员职能:

1
2
3
4
5
6
7
8
9
10
class Complex
{
public:
   std::ostream& output(std::ostream& s) const;
};

std::ostream& operator<< (std::ostream& s, const Complex& c)
{
   return c.output(s);
}