簡體   English   中英

無法使用 ostream 打印但可以使用 cout 打印?

[英]cannot print using ostream but can by using cout?

讓這是示例代碼:

object o1(//parameters);
object o2(//parameters);
object o3(//parameters);
object *v[3];

using std::cout; //video output
ofstream of;     //save on file

//let's suppose

v[0]=&o1;
v[1]=&o2;
v[2]=&o3;
for (int i=0;i<3;i++) {
    v[i]->view(cout);
    v[i]->save(of);
}

view函數只是類參數的視頻打印函數,而save函數將類的參數保存在文件中。 問題是,如果我聲明std::ostream; ostream os; 為什么我不能使用v[i]->view(os)來輸出視頻? 如果我使用v[i]->view(os)它說:

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

雖然這對於視頻輸出來說是正確的,但對於保存功能來說卻不是,它可以正常工作,就像代碼中的預期一樣。 有人可以解釋一下嗎? 對不起,如果我做得很長

問題:

1) 如果view函數定義為:

void view(std::ostream output, std::string text) // (1)
{
    output << text;
}

並使用:

view(std::cout, "Hello, World!"); // (2)

然后編譯器給出錯誤信息:

在 MSVC 中:

error C2280: 'std::basic_ostream<char,std::char_traits<char>>::basic_ostream(const std::basic_ostream<char,std::char_traits<char>> &)': attempting to reference a deleted function

海灣合作委員會:

error: use of deleted function 'std::basic_ostream<_CharT, _Traits>::basic_ostream(const std::basic_ostream<_CharT, _Traits>&) [with _CharT = char; _Traits = std::char_traits<char>]'

鐺:

error: call to deleted constructor of 'std::ostream' (aka 'basic_ostream<char>')


2) 對於申報

std::ostream os;

顯示以下錯誤消息:

MSVC:

error C2512: 'std::basic_ostream<char,std::char_traits<char>>': no appropriate default constructor available

海灣合作委員會:

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

鐺:

error: calling a protected constructor of class 'std::basic_ostream<char>'


原因:

這都是根據std::basic_ostream的規范

沒有默認構造函數的定義 - 因此,如果沒有特定的構造函數參數,則無法創建std::ostream類型的變量。

正如 C++ 參考所說的std::basic_ostream 復制構造函數

復制構造函數受到保護,並被刪除。 輸出流不可復制。


解釋:

1)所以問題是在(2)中參數std::cout被傳遞給一個在(1)定義的函數,以將std::ostream復制到變量output

但是類的定義說不能使用復制構造函數,所以編譯器給出了錯誤信息。

2) 在創建變量os的情況下 - 它沒有給出任何構造函數參數,沒有默認構造函數,因此編譯器給出了錯誤消息。


如何解決這個問題?

1) 在函數的聲明中更改定義以將std::ostream的引用 ( & ) 作為參數:

void view(std::ostream& output, std::string text) // (1)

這允許它使用原始對象而不是制作副本(不允許復制)。


2) 如果需要一個變量,那么也應該使用一個引用;

std::ostream& out = std::cout;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM