2015-04-05 89 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