C++模板中类(Class)和类型名(TypeName)的区别

5

我对 C++ 模板有些困惑。

考虑以下模板:

template<class TYPE>
void function(TYPE data)

并且。
template<typename TYPE>
void function(TYPE data)

我感到困惑的是,typename 和 class 作为变量标识符或类型之间的区别是什么。


5
你可以在参考链接中看到,没有任何区别。 - chris
2个回答

13

为了指定(类型)模板参数,它们两者完全相同,就像 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;

因此,我想选择使用哪个取决于程序员。或者说,其中一个有一些好处,比如在内存管理或更深层次的东西上吗? - kcc__
2
@kcc__ “exactly identical” 意味着“完全相同”。 - juanchopanza
3
有一个重要的区别:classtypename短3个字母。 - Yakk - Adam Nevraumont
1
@Yakk,我刚刚开了个玩笑吗?如果你回答不了,请不要评论。 - kcc__
2
@kcc__ 我不是在开玩笑。 在template中声明类型时,classtypename短3个字母的事实是使用这两者之间最重要的区别。 简化37%的样板代码非常重要! - Yakk - Adam Nevraumont
显示剩余2条评论

3

这两者之间确实有区别。

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也被用作一个关键字来访问依赖的模板名字


2
这个答案很快就会失效:在当前的标准化迭代中,temlate<template<class,class>typename Z, class A, class B> 将是合法的,并且与 template<template<class,class>class Z, class A, class B> 的意义相同。句子“class 定义了一个类,所以如果你想定义…” 有一个真正的结论和前提,但两者只有模糊的联系。;) 的确,非类模板的引入是 class 关键字在此处要求被删除的原因,但它们并不是同时发生的! - Yakk - Adam Nevraumont

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接