2009-06-18 49 views
0

通常,對於我的模板化類,我將.hpp文件中的聲明和.t.hpp文件中的模板實現代碼包含在內。我明確實例在.cpp文件中的類:模板化操作符<<顯式實例化和頭文件

template class MyClass<AnotherClass>; 

,其對象代碼被放在一個庫。

的問題是,如果我嘗試打印與operator<<的對象,這是在.hpp文件中聲明,並在.t.hpp文件中定義爲:

template<class T> 
std::ostream& operator<<(std::ostream& os, const MyClass<T>& c) 
{ 
    os << "Hello, I am being output."; 
    return os; 
} 

我得到一個鏈接錯誤,指出正確的符號未定義。

據我所知,這是因爲這個模板函數沒有顯式實例化時,類是。有沒有辦法繞過這個,而不是在任何時候想要在課上使用operator<<或將模板化功能代碼移動到.hpp文件中時包含.t.hpp文件?我可以顯式實例化函數代碼嗎?

回答

2

您可以顯式實例函數模板

template std::ostream& operator<<(std::ostream&, const MyClass<int>&); 

要實例專業化與T = int。如果可以推導出所有模板參數(如本例中爲類型MyClass<int>),那麼可以省略模板參數括號(如果不能,例如因爲模板參數不在函數參數類型中出現),則必須明確指定它

template<typename T> void f() { } 
template void f<int>(); 
+0

+1。我只是添加了非推斷的案例,看到你已經更新,包括... Grr! :) – 2009-06-18 17:30:03

+0

謝謝!這正是我所需要的。我沒有意識到模板化函數可以被明確實例化。 – 2009-06-18 23:32:35

2

litb's solution

針對您的特殊情況下,編譯器可以推斷出參數的所有模板參數和返回值的類型,但如果不能,你可以明確地給他們:

template std::ostream& operator<< <T>(std::ostream&, const MyClass<T>&); 

如果可以推導出模板參數,這仍然是允許的。

請問:您是否有理由爲什麼您更願意明確實例化所有內容?你爲自己做了很多工作。通過避免在任何地方包含模板源代碼,你肯定會節省編譯時間,但它在開發時間是否值得?