关于 std::ostream 构造函数

Jad*_*den 2 c++ ostream

我想这样使用std::ostream

int main()
{
    std::ostream os;
    os << "something ..." << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Aki*_*ira 5

std::ostream,该std::istream或者std::iostream是流类型的基类(例如std::stringstreamstd::fstream等)中标准库。这些类受保护免于实例化,您只能实例化它们的派生类。错误信息

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

告诉你一样。

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

#include <iostream>

int main() {
    std::ostream& os = std::cout;
    os << "something ..." << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

使用std::ostream&in 重载的原因operator<<是您可能不想为所有单独的流类型重载上述运算符,而只想重载具有该<<功能的它们的公共基类。