簡體   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