2012-01-23 139 views
3

Possible Duplicate:
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

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

回答

9

operator <<应该是免费功能,不Complex类成员,你的情况。

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

std::cout << complex_number; 

complex_number << std::cout; 

这相当于

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

这是不常见的做法,你可以注意到,这是为什么operator <<通常定义为自由功能。

+2

,而且这个免费函数通常会成为你的对象的“朋友”。 – AJG85

0

宣布作为朋友是这样的:

friend ostream& Complex::operator<<(ostream& out,const Complex& b) 
{ ... } 

编辑 >>

我相信上面是不正确的,因为在宣布的.cpp的朋友是一个错误的语法,它必须是在类定义中声明为.h文件中的朋友,并且使其成为全局函数。

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

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

更多的朋友here

+3

它不能同时是朋友,并在同一时间一员。 –

+0

你是对的,这个话题可能会令人困惑,我的记忆不是新鲜的。在.h文件中声明一个运算符为朋友实际上使它成为一个全局函数,它应该是正确的语法,所以可能不是.cpp文件中的朋友。我认为它是一种禁止(如果我的记忆是正确的)。 – zar

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