我有一個自定義輸出類,其中有兩個std::ostream
成員可用於不同的目的。根據輸出類的配置方式使用兩種流。在某些情況下,這兩股流是鏈接在一起的。下面是一個非常簡化的類。如有需要,我可以提供更多細節。流操作符其中lhs不是std :: iostream實例
class c_Output
{
public:
c_Output (bool x_useA) : m_useA(x_useA) { /* setup m_stream[AB] here */ };
~c_Output();
inline std::ostream& stream() { return (m_useA ? m_streamA : m_streamB); };
private:
bool m_useA;
std::ostream m_streamA;
std::ostream m_streamB;
}
我知道怎麼寫流運營商,我想流往/返std::cout
,std::cin
,或任何其他std::iostream
,但我很努力寫中流作業,其中一個c_Output
實例作爲LHS替代類的一個std::ostream
實例。
現在,我能夠與閃避:
c_Output l_output;
uint64_t l_value = 0xc001c0de;
l_output.stream() << std::hex << std::setw(16) << std::setfill('0') << l_value;
c_Output::stream()
返回相應std::ostream&
,從而預期這種表現而已。
我想重寫上面爲:
c_Output l_output;
uint64_t l_value = 0xc001c0de;
l_output << std::hex << std::setw(16) << std::setfill('0') << l_value;
我曾嘗試幾個不同的版本基礎上的例子,我在這裏看到在計算器上和更大的網絡無濟於事定義operator<<
的。最新版本如下所示:
// in header
class c_Output
{
...
friend c_Output& operator<< (c_Output& x_output, std::ostream& x_stream);
...
}
// in source
c_Output&
operator<< (c_Output& x_output, std::ostream& x_stream)
{
x_output.stream() << x_stream;
return x_output;
}
參數的設置旨在鏡像標準流操作符重載。此設置給我編譯問題,如:
error: no match for 'operator<<' in 'l_output << std::hex'
note: candidates are: c_Output& operator<<(c_Output&, std::ostream&)
我已經剝去了所有的文件和行信息,但它得到了重點。我顯然得到了不正確的操作符的類型。根據需要,實現流操作符的正確類型和/或正確方法是什麼?
還有一個補充c_Input
類有類似的要求,但適應c_Output
的答案應該是微不足道的。
你使用你的l_output.stream()方法有問題嗎?儘管沒有使用模板編程,但我不確定是否有一個好的解決方案,儘管明天我必須在清醒時回覆你。 – leetNightshade 2013-05-03 02:35:49
我從辦公室開車回家時可能會有一段愉快的時光,所以直到早上我都無法檢測出這個想法。 – user2345208 2013-05-03 02:37:04
(沒有意識到輸入文章的評論; cont以上) 我可以簡單地用模板參數替換rhs,並讓編譯器擔心將級聯流操作符拼接在一起。 我也在考慮將返回類型改爲'void',因爲我不想允許後續級聯(即'blah << l_output << blah'。 – user2345208 2013-05-03 02:43:55