重载运算符<<关于流的串联问题

时间:2011-01-09 18:40:42

标签: c++ operator-overloading concatenation ofstream

我有以下代码:

struct simple
{
    simple (int a1, int a2) : member1(a1), member2(a2) {}
    int member1;
    int member2;
};

std::ofstream &operator << (std::ofstream &f, const simple &obj)
{
    f<<obj.member1<<", "<<obj.member2;
    return f;
} 
int main(int argc, const char *argv[])
{
    std::ofstream f("streamout.txt");

    simple s(7,5);
    f << s;               //#1 This works
    f << "label: " << s;  //#2 This fails

    return 0;
}

我试图理解为什么#1有效,而在尝试使用重载运算符连接时出现问题,因为#2失败并出现以下错误(MacOSX上的gcc 4.5.3):

  

错误:无法绑定   'std :: basic_ostream'左值   '的std :: basic_ostream和放大器;&安培;'   /GCC-FACTORY/4.5/INSTALL/lib/gcc/x86_64-apple-darwin10.5.0/4.5.3/../../../../include/c++/4.5.3/ostream:579:5 :   错误:初始化参数1   'std :: basic_ostream&lt; _CharT,_Traits&gt;&amp;   的std ::运营商LT;≤(标准:: basic_ostream&LT; _CharT,   _Traits&gt;&amp;&amp;,const _Tp&amp;)[with _CharT = char,_Traits =   std :: char_traits,_Tp = simple]'

如果我将运算符定义为

,那么一切都很好
std::ostream &operator << (std::ostream &f, const simple &obj)
{ ... }

听起来像是与重载解析相关的东西,其中有一些插入到ofstream中的东西已经提供了重载(在这种情况下是const char *“label”)在重载解析后分解,但我不能真的了解到底发生了什么。 我想清楚地了解编译器尝试做什么..

1 个答案:

答案 0 :(得分:17)

在线:

f << "label: " << s;

因为对operator<<的第一次调用返回std::ostream &,所以第二次调用无法编译:操作符的左操作数不再是std::ofstream类型,并且找不到重载。

您应该使用第二个签名,因为我认为没有理由将您的类型限制为std::ofstream