[C++] 模板中關鍵字'typename'和'class'的區別?


Answers

為了命名模板參數, typenameclass是等價的。 §14.1.2:

模板參數中的類和類型名稱之間沒有語義上的區別。

然而,在使用模板時, typename在另一個上下文中是可能的 - 向編譯器提示您指向依賴類型。 §14.6.2:

除非適用的名稱查找找到類型名稱或名稱由關鍵字typename限定,否則假定在模板聲明或定義中使用的名稱取決於模板參數,而不是為類型命名。

例:

typename some_template<T>::some_type

如果沒有typename那麼編譯器通常無法說明您是否指向某個類型。

Question

對於模板,我看到了兩個聲明:

template < typename T >
template < class T >

有什麼不同?

在下面的例子中,這些關鍵詞究竟意味著什麼(摘自德國維基百科有關模板的文章)?

template < template < typename, typename > class Container, typename Type >
class Example
{
     Container< Type, std::allocator < Type > > baz;
};



  1. 沒有不同
  2. 模板類型參數Container本身是一個具有兩個類型參數的模板。