2013-04-15 38 views
1

標誌的io_base我稱之爲物流設置的std ::自定義流類

class Stream 
public: 
    Stream& operator<<(int i) { stream_ << i; return *this;} 
      template <typename CustomClass> 
      Stream& operator<<(const CustomClass& c) { stream_ << c.toString() /* assume this template always have toString(); return *this; } 
private: 
    std::stringstream stream_; 
}; 

這是什麼,我其實有一個非常簡單的例子一個自定義類。我試圖設置如下std :: ios_base標誌:

Stream() << 1 << std::hex << 2; 

using operator;

Stream& operator<<(std::ios_base& b) { stream_.setf(b.flags()); return *this; } 

從我的理解,因爲std :: hex返回std :: ios_base所以它應該調用這個並設置流的標誌。但它總是稱之爲模板。注意:如果我刪除了這個模板,那麼所有的工作都和你期望的一樣好,但是有兩種方法嗎?

請隨時進一步問,如果你需要更多的澄清

+0

只是爲了澄清多一點什麼,我想就是讓** **的ios_base重載運算符重要在模板上。我相信這是非常奇怪的行爲,因爲模板應該放在最後,如果沒有其他類型可以在編譯時解決它應該被使用。我相信std庫在所有其他庫之前是鏈接的。 – abumusamq

+0

順便說一句,即使我返回'std :: ios_base&'和返回流,這不工作我的意思是它仍然通過類型過載調用模板 – abumusamq

回答

0

的iostream操縱不std::ios_base類型的對象,他們是接受和返回std::ios_base引用功能。所以,當你想要做關於這些對象流插入,你必須重載函數指針

Stream& operator<<(std::ios_base& (*manip)(std::ios_base&)) 
//     ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^ 
{ 
    manip(this->stream); 
    return *this; 
}