C++ 模板中的template typename 和template class的區別
本文翻譯自:點擊打開鏈接
在大多數情況下,template<typename T> 與template<class T>是可以相互通用的,而且在早期的C++ 版本中也隻有template<class T>一種申明方式。
但是這種重複利用已存在的關鍵字的方式似乎會引起混淆。比如下麵這樣一個例子:
template <class T> class Demonstration { public: void method() { T::A *aObj; // oops … // … };<span > </span>
代碼的本意是想生命一個類型為T::A的對象指針 aObj,其中A是模板類T中的一個子類。但是編譯器卻會將這條語句理解成一個表達式,即T中的靜態成員A 與 aObj相乘。這無疑並非是我們想要的。因為這種情況的出現,C++中引進了template<typename T>。一次來解決這種情況。
typename T::A* a6; // declare pointer to T’s A
這條語句會告訴編譯器這是一條聲明語句,聲明一個T的內部類A的指針對象。
所以在選擇使用typename和class時,如果沒有上述的這種情況,那麼二者可以通用;如果有,那麼就必須使用typename!
最後更新:2017-04-03 05:39:04