繁体   English   中英

关于std :: ostream构造函数

[英]About std::ostream constructor

我想像这样使用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<<可能像这样重载:

// 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等)。 这些类受实例化保护,您只能实例化其派生类。 错误消息

错误:'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;
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM