我對C++模板有些困惑。C++模板的Class和Typename之間的區別
考慮以下
template<class TYPE>
void function(TYPE data)
和
模板template<typename TYPE>
void function(TYPE data)
我的困惑是正是作爲變量標識或類型類型名稱和類之間的區別。
我對C++模板有些困惑。C++模板的Class和Typename之間的區別
考慮以下
template<class TYPE>
void function(TYPE data)
和
模板template<typename TYPE>
void function(TYPE data)
我的困惑是正是作爲變量標識或類型類型名稱和類之間的區別。
用於指定(類型)模板參數,兩者是完全相同的,就像int
/signed int
,或&&
/and
:template <typename>
/template <class>
。
好奇限制適用於模板的模板參數多達C++ 14:
template <template <typename> class Tmpl> struct Foo;
// ^^^^^
這裏只關鍵字class
被允許指定模板的模板參數。
C++ 14後,你就可以一直使用兩種class
或typename
無處不在:
template <template <typename> typename Tmpl> struct Foo;
因此,他們選擇使用任何一種都是我想的程序員。或者任何一方在內存管理或更深層次上都有一些好處? – 2015-04-05 14:46:32
@kcc__「完全相同」表示「完全相同」。 – juanchopanza 2015-04-05 15:06:29
@kcc有一個重要的區別:'class'比'typename'短3個字母。 – Yakk 2015-04-05 17:13:06
在這兩個之間的差異。
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。
這個答案很快就會出錯:在目前的標準化迭代中,'temlate typename Z,class A,class B>'將是合法的並且與template 具有相同的含義,class A,class A ,B類>'。 「'class'這個句子定義了一個類,所以如果你想定義...」有一個真實的結論,一個真實的前提,但是這兩個只是模糊的連接。 ;)非類模板的引入確實是爲什麼類的關鍵字要求被拋棄的原因,但這些並不是同時發生的! – Yakk 2015-04-06 14:00:58
您可以在[參考](http://en.cppreference.com/w/cpp/language/template_parameters#Type_template_parameter)中看到沒有區別。 – chris 2015-04-05 14:39:58