2015-04-05 48 views
0

我對C++模板有些困惑。C++模板的Class和Typename之間的區別

考慮以下

template<class TYPE> 
void function(TYPE data) 

模板
template<typename TYPE> 
void function(TYPE data) 

我的困惑是正是作爲變量標識或類型類型名稱和類之間的區別。

+3

您可以在[參考](http://en.cppreference.com/w/cpp/language/template_parameters#Type_template_parameter)中看到沒有區別。 – chris 2015-04-05 14:39:58

回答

9

用於指定(類型)模板參數,兩者是完全相同的,就像int/signed int,或&&/andtemplate <typename>/template <class>

好奇限制適用於模板的模板參數多達C++ 14:

template <template <typename> class Tmpl> struct Foo; 
//       ^^^^^ 

這裏只關鍵字class被允許指定模板的模板參數。

C++ 14後,你就可以一直使用兩種classtypename無處不在:

template <template <typename> typename Tmpl> struct Foo; 
+0

因此,他們選擇使用任何一種都是我想的程序員。或者任何一方在內存管理或更深層次上都有一些好處? – 2015-04-05 14:46:32

+2

@kcc__「完全相同」表示「完全相同」。 – juanchopanza 2015-04-05 15:06:29

+3

@kcc有一個重要的區別:'class'比'typename'短3個字母。 – Yakk 2015-04-05 17:13:06

2

在這兩個之間的差異。

class定義了一個類,所以如果你想定義一個模板類作爲模板參數,你必須使用它。

例如,你可以定義接收模板類類型的模板:

template <class A> 
class Blah 
{ 

}; 

template <template <class , class> class T, class A, class B> 
class Blah<T<A,B>> 
{ 

}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    Blah<std::vector<int>> a; 

    return 0; 
} 

你不能聲明一個這樣的模板類typename

另外typename被用作關鍵字來訪問dependent template names

+2

這個答案很快就會出錯:在目前的標準化迭代中,'temlate