关于 std::ostream 构造函数

About std::ostream constructor

我想这样使用std::ostream

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

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

error: ‘std::basic_ostream<_CharT, _Traits>::basic_ostream() [with _CharT = char; _Traits = std::char_traits]’ is protected.

但我记得 operator<< 可以这样重载:

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

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

std::ostreamstd::istreamstd::iostream 是基本的 class 流类型(例如 std::stringstreamstd::fstream、等)在 Standard Library 中。这些 classes 受实例化保护,您只能实例化它们派生的 classes。错误信息

error: 'std::basic_ostream<_CharT, _Traits>::basic_ostream() [with _CharT = char; _Traits = std::char_traits]' is protected

告诉你同样的事情。

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

的示例
#include <iostream>

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

operator<< 的重载中使用 std::ostream& 的原因是您可能不想为所有单独的流类型重载提到的运算符,而只是为了公共基础 [=其中 31=] 个具有 << 功能。