2013-05-03 48 views
0

我有一個自定義輸出類,其中有兩個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::coutstd::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的答案應該是微不足道的。

+0

你使用你的l_output.stream()方法有問題嗎?儘管沒有使用模板編程,但我不確定是否有一個好的解決方案,儘管明天我必須在清醒時回覆你。 – leetNightshade 2013-05-03 02:35:49

+0

我從辦公室開車回家時可能會有一段愉快的時光,所以直到早上我都無法檢測出這個想法。 – user2345208 2013-05-03 02:37:04

+0

(沒有意識到輸入文章的評論; cont以上) 我可以簡單地用模板參數替換rhs,並讓編譯器擔心將級聯流操作符拼接在一起。 我也在考慮將返回類型改爲'void',因爲我不想允許後續級聯(即'blah << l_output << blah'。 – user2345208 2013-05-03 02:43:55

回答

0

std::hex的類型是std::ios_base& (*)(std::ios_base&)。您的運營商的簽名改爲:

c_Output& operator<< (c_Output& x_output, std::ios_base& (*x_stream)(std::ios_base&)); 
0
operator<< (c_Output& x_output, std::ostream& x_stream) 

唯一真正的問題是,std::hex不是std::ostream,並用你的方法沒有重載<<適用於它。

爲了支持hex改性劑的使用,你需要另一個friend超載與參數(c_Output&, ios_base& (*)(ios_base&))(如hex is a pointer to function taking reference to ios_base returning reference to ios_base)。

按照您要去的速度,您還需要執行all the other << overloads。這不是一項簡單的任務,但有必要僞裝成std::ostream,無論是否從中繼承。

相關問題