6

我有一个看起来像这样的结构:

sturct person
{
    string surname;
    person(string n) : surname(n) {};
}

我需要operator<<std::ostreamand重载person。我写了这个函数:

std::ostream operator<<(std::ostream & s, person & os)
{
    s << os.surname;
    return s;
}

但我收到此错误:

/usr/include/c++/4.6/bits/ios_base.h|788|错误:'std::ios_base::ios_base(const std::ios_base&)' 是私有的|

/usr/include/c++/4.6/bits/basic_ios.h|64|error:在此上下文中

/usr/include/c++/4.6/ostream|57|注意:这里首先需要综合方法'std::basic_ios::basic_ios(const std::basic_ios&)' |

4

3 回答 3

18

std::ostream不是可复制构造的,当您按值返回时,您就是在复制构造。尽管返回值优化意味着实际上可能不会进行复制,但编译器仍然要求可以进行复制。

此运算符的规范返回值是非常量引用:

std::ostream& operator<<(std::ostream& o, const SomeType& t);
于 2012-08-23T10:28:03.447 回答
3

通过引用返回:

std::ostream& operator<<(...)
          //^

否则将尝试复制s,并且ostreams 是不可复制的(错误消息说明尝试访问private复制构造函数)。

于 2012-08-23T10:25:03.743 回答
2

您忘记了返回类型中的引用:

std::ostream &operator<<(std::ostream & s, person & os)
{
    return s << os.surname;
}
于 2012-08-23T10:25:03.230 回答