我对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