我对c ++模板感到有些困惑。
考虑下面的模板
template<class TYPE>
void function(TYPE data)
和
template<typename TYPE>
void function(TYPE data)
我的困惑正是用作变量标识或类型的typename和class之间的区别。
答案 0 :(得分:9)
对于指定(类型)模板参数,两者完全相同,就像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;
答案 1 :(得分: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 。