我想像这样使用std::ostream
:
int main()
{
std::ostream os;
os << "something ..." << std::endl;
return 0;
}
有一个错误说ostream构造函数受到保护:
错误:'std :: basic_ostream&lt; _CharT,_Traits&gt; :: basic_ostream()[with _CharT = char;
但我记得operator<<
可能会像这样重载:
// In a class.
friend std::ostream & operator<<(std::ostream& out, const String & s) {
out << s.m_s;
return out;
}
关于为什么我的代码不起作用的任何建议?
答案 0 :(得分:3)
std::ostream
,std::istream
或std::iostream
是std::stringstream
,std::fstream
等基类的基类。{{ 3}}。这些类受实例化保护,您只能实例化其派生类。错误消息
错误:'std :: basic_ostream&lt; _CharT,_Traits&gt; :: 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;
}
在std::ostream&
的重载中使用operator<<
的原因是你可能不希望为所有单独的流类型重载所提到的运算符,但仅针对它们的公共基类具有<<
功能。