【问题标题】:'std::ios_base::ios_base(const std::ios_base&)’ is private' error while overloading operator<< for std::ostram'std::ios_base::ios_base(const std::ios_base&)' is private' 重载 operator<< 为 std::ostram 时出错
【发布时间】:2012-08-23 10:23:23
【问题描述】:

我有一个如下所示的结构:

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

我需要为std::ostreamperson 重载operator&lt;&lt;。我写了这个函数:

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|错误:在此上下文中

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

【问题讨论】:

    标签: c++ iostream ostream


    【解决方案1】:

    std::ostream 不可复制构造,当您按值返回时,您正在复制构造。尽管return value optimization 表示实际上可能不会进行复制,但编译器仍然要求可以进行复制。

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

    std::ostream& operator<<(std::ostream& o, const SomeType& t);
    

    【讨论】:

    • 谢谢你,帮了我:) +1
    【解决方案2】:

    引用返回:

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

    否则会尝试复制s,而ostreams 是不可复制的(错误消息表明尝试访​​问private 复制构造函数)。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-28
        • 1970-01-01
        • 1970-01-01
        • 2022-01-15
        • 2017-03-11
        • 2015-01-15
        相关资源
        最近更新 更多