C ++模板的Class和Typename之间的区别

时间:2015-04-05 14:38:30

标签: c++ templates c++11

我对c ++模板感到有些困惑。

考虑下面的模板

template<class TYPE>
void function(TYPE data)

template<typename TYPE>
void function(TYPE data)

我的困惑正是用作变量标识或类型的typename和class之间的区别。

2 个答案:

答案 0 :(得分: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;

答案 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