运营商LT;<超载

时间:2012-01-23 20:37:13

标签: c++ operator-overloading

  

可能重复:
  Operator overloading

我没有找到任何可以帮助我解决这个问题的事情...... 我正试图过载<< operator,这是我的代码:

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

这是H文件中的声明:

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

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

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

3 个答案:

答案 0 :(得分:10)

您的operator <<应该是免费功能,而不是Complex类成员。

如果你做了operator <<类成员,它实际上应该采用一个参数,该参数应为stream。但那时你将无法像

那样写作
std::cout << complex_number;

complex_number << std::cout;

相当于

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

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

答案 1 :(得分:1)

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;
}

更多信息here

答案 2 :(得分:0)

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

就个人而言,我更喜欢远离friend发货并转而使用公共会员功能:

class Complex
{
public:
   std::ostream& output(std::ostream& s) const;
};

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