我用:
template<class T>
Arbol<T>::Arbol(){
}
当T
你要上课的时候。
并使用:
template<typename T>
Arbol<T>::Arbol(){
}
当它将T
成为一个类型时,例如bool
,即char
基本类型。
但是看着一个程序的代码片段(不是我创建的),我看到它typename
在我通常使用的地方使用class
,直到现在我还没有注意到。如果现在你问我为什么,好吧,我不能说百分百为什么,但也许我(想象)编译器在它是语言中包含的类型时会区分并相应地采取行动。
我的问题是:
使用一个或另一个是否相同?
好吧,现在我已经对它们进行了测试并且它们都可以正常工作,但是我不知道我是否遗漏了某些东西,或者在这种情况下class
和之间可能存在一些细微的差异。typename
在这种情况下,它是相同的,没有区别。
它们可以互换使用,并且由于历史原因而存在。
在 Stan Lippman 的这篇博文中,他解释说Stroustrup最初不想引入新的关键字并重用
class
. 在 ISO-C++ 标准之前,它是声明它的唯一方法。在标准化过程中,发现这会导致语法歧义(见博客),因此决定引入一个新的关键字来解决它。这是
typename
。它最终被重载class
以typename
保持向后兼容性。关于使用
typename
或class
声明模板的类型参数,在大多数情况下使用其中一个关键字是无关紧要的,但在某些情况下需要使用其中一个或另一个。例如,模板参数的类型需要using (但在 C++17 中这可能会改变),并且需要 using来帮助编译器区分类型或值(当类型依赖时)。
class
typename
摘自论文 n4051(翻译是我的):
简而言之,对于绝大多数情况
class
或typename
无关紧要,但typename
它是消除依赖类型歧义的唯一选择,并且class
是模板参数类型所必需的;它们是两个关键字不可互换的唯一两种情况,但它们不是最常见的用途。当声明一个
template
简单时,使用class
or是无关紧要的typename
。两者完全相同。但是,对于某些用途,我们将没有那么多的选择自由。如果我们需要使用用于专门化的类/结构提供的类型,
template
我们将不得不在template
. 在这种情况下,我们将不得不使用typename
:如果其中一种类型
template
变成另一种类型template
(例如容器),class
如果我们想要template
编译,我们将不得不使用: