[英]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::ostream
, std::istream
或std::iostream
是標准庫中流類型的基類(例如std::stringstream
, std::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.