2010-07-19 101 views

回答

2

要專門化模板,首先必須聲明一個模板。

如果是免費的operator<<,則不需要模板;你可以重載它爲您my_type類:

std::ostream& operator<<(std::ostream& strm, my_type obj); 

如果你的對象是不是在大小瑣碎,你可能要考慮通過一個const引用傳遞,這樣你流呢,你不要每次複製:

std::ostream& operator<<(std::ostream& strm, const my_type& obj); 

(從技術上可以明確專門的operator<<,但我不認爲這是你想要或需要的東西。爲了能夠使用模板操作< <與平時< <語法。你需要製作模板專業化可從一個參數類型中推導出來。

E.g.

// template op << 
template< class T > 
std::ostream& operator<<(std::ostream&, const MyTemplClass<T>&); 

// specialization of above 
template<> 
std::ostream& operator<< <int>(std::ostream&, const MyTemplClass<int>&); 

+0

Charles請閱讀我對GMan的回答所寫的評論 – 2010-07-19 21:02:35

+0

@Davit Siradeghyan:如果你有一個模板,它是所有*類型的catch不用說,這幾乎總是一個壞主意),那麼你可以專門化它,但是對於你的特定類型來說,重載它仍然更簡單,重載解析會選擇一個非模板函數在函數模板上的精確匹配 – 2010-07-19 21:12:05

+0

與查爾斯一起,擁有一個完全通用的插入操作符似乎非常危險。 – GManNickG 2010-07-19 21:15:53

2

爲什麼不只是超負荷?

// no template <> 
std::ostream& operator<<(std::ostream& strm, my_type obj); 

當存在一個模板專攻你只專注。

您的參數應該可能是const my_type&,以避免不必要的副本。

+0

是的,我知道重載,我需要重載operator <<爲一組類型,想象在操作符體內部,我正在檢查某些T1,T2或t3的類型,爲它們做一件事,爲所有其他類型做另一件事 – 2010-07-19 21:01:24

+0

@Davit:如何而不是'想象',你張貼在他的問題更大的圖片? :)我們得到的信息越多,答案就越好。 (換句話說:發佈問題,而不是步) – GManNickG 2010-07-19 21:02:35

+0

這是我的代碼 模板 的std :: ostream的和運營商<<(STD :: ostream的和STRM,常量牛逼&e); ,我想專攻operator <<用於一些不是POD類型的T1,T2和T3類型 – 2010-07-19 21:05:36