【问题标题】:About std::ostream constructor关于 std::ostream 构造函数
【发布时间】:2017-12-23 15:08:55
【问题描述】:

我想像这样使用std::ostream

int main()
{
    std::ostream os;
    os << "something ..." << std::endl;
    return 0;
}

有一个错误说ostream构造函数被保护:

错误:'std::basic_ostream<_chart _traits>::basic_ostream() [with _CharT = char; _Traits = std::char_traits]' 受到保护。

但我记得operator&lt;&lt; 可以像这样重载:

// In a class. 
friend std::ostream & operator<<(std::ostream& out, const String & s) {
    out << s.m_s;
    return out;
}

关于我的代码为什么不起作用的任何建议?

【问题讨论】:

  • 您有#include &lt;ostream&gt; 预处理指令吗?我也不认为有一个无参数的ostream 构造函数 - 请参阅hereostreams 应该被包裹在一个流缓冲区周围 - 你是不是要使用 fstream 或类似的代替?
  • 是的,我已经包含了 。我想像重载运算符
  • 不,我的意思是#include &lt;ostream&gt;。在 C++11 之前,仅包含 iostream 并不总是足以包含 ostream(尽管我现在找不到解释这一点的 SO 帖子)。是的 - 如果您将 streambuf 对象作为参数传入,则只能创建 ostream 对象。然后ostream 将输出到该缓冲区。简单解释见this post
  • 你到底想做什么?用你的最终目标更新你的问题。您实际上不太可能想要使用原始 ostream 对象,您更可能想要 stringstreamfstream
  • @Jaden,我已经更新了我的答案。我希望它可能会有所帮助。

标签: c++ ostream


【解决方案1】:

std::ostreamstd::istreamstd::iostreamStandard Library 中流类型的基类(例如std::stringstreamstd::fstream 等)。这些类受到实例化保护,您只能实例化它们的派生类。错误信息

错误:'std::basic_ostream<_chart _traits>::basic_ostream() [with _CharT = char; _Traits = std::char_traits]' 受保护

告诉你同样的。

您的第二个示例是有效的,因为您可以使用对派生类的基类的引用。在这种情况下,不调用构造函数,引用仅引用现有对象。这是一个如何使用std::ostream&amp;std::cout 的示例:

#include <iostream>

int main() {
    std::ostream& os = std::cout;
    os << "something ..." << std::endl;
}

operator&lt;&lt; 的重载中使用std::ostream&amp; 背后的原因是,您可能不想为所有单独的流类型重载上述运算符,而只为它们的公共基类重载@987654332 @ 功能。

【讨论】:

    猜你喜欢
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多