閱讀265 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go Spark上對SequenceFile的支持
  下一篇:go C編程規範, 示例代碼。