关于C ++:关于std :: ostream构造函数

About std::ostream constructor

我想这样使用std::ostream

1
2
3
4
5
6
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<<可能会像这样重载:

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

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


std::ostreamstd::istreamstd::iostream是标准库中流类型(例如std::stringstreamstd::fstream等)的基本类。 这些类具有实例化保护,您只能实例化其派生类。 错误讯息

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

告诉你一样。

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

1
2
3
4
5
6
#include <iostream>

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

operator<<的重载中使用std::ostream&的原因是,您可能不想为所有单个流类型重载所提到的运算符,而只希望为它们具有<<功能的通用基类重载。