模板类和类模板有什么区别?

模板类和类模板有什么区别?

这是许多人(包括维基百科上的generics编程页面,一些C ++教程,以及本页面上的其他答案)的一个常见的困惑点。 就C ++而言, 没有像“模板类”这样的东西,只有一个“类模板”。 阅读这个短语的方式是“类的模板”,而不是“function模板”,即“function模板”。 同样:类不定义模板,模板定义类 (和函数)。 例如,这是一个模板 ,特别是一个类模板 ,但不是一个类

template<typename T> class MyClassTemplate { ... }; 

声明MyClassTemplate<int> 是一个类,或者是一个基于模板的类。 没有基于模板的类的特殊属性而不是基于模板的类。 特殊的属性是模板本身

“模板类”一词意味着什么,因为就“C ++”而言,“模板”一词在应用于名词“类”时没有任何意义。 它意味着存在一个 (或定义)一个模板 ,这不是一个存在于C ++中的概念。

我理解这种常见的混淆,因为它可能是基于这样一个事实,即单词以实际语言中的“模板类”的顺序出现,这是另外一个故事。

不同之处在于,“模板类”一词根本就不存在于C ++标准中。 这个术语主要是由那些认为“class级模板”这个名词混淆的人(像Qt公司诺基亚和以前的奇趣科技一样)。

该标准没有概念,所以这是由其他人做出的。 有些人使用同义词,有人说“模板类”一词是指一个实例化或明确专门化的类模板,这将使其等同于术语“类模板专业化”。 历史上,它有这个意思。 注释参考手册在第343页定义

从类模板生成的类称为模板类,就像使用template-class-name作为名称专门定义的类一样

非terminal模板类名相当于当今标准中使用的非terminal模板标识符 ,并且归属于template-name < arguments >


为了让你熟悉今天的术语,这比使用可疑的旧术语更重要

 // (1) defines a class template template<typename T> class A { }; // (2) defines a class template explicit specialization template<> class A<int> { }; // (3) defines a class template partial specialization template<typename T> class A<T*> { }; // (4) explicitly instantiates A<char>. template class A<char>; // (5) implicitly instantiates A<short> (because of the member declaration) struct D { A<short> a; }; 
  • ARM调用类(2),由(4)和(5)生成的类为模板类 。 我不确定ARM是否已经知道部分专业化。 但是如果这样(3)没有被称为模板类,因为(3)没有定义一个类,而是定义了一个模板。
  • 当前的Standard调用类(2),以及由(4)和(5) 类模板专门化生成的 。 (3)被称为部分专业化 ,而不是明确的专业化 。 它有时也称为(3)专业化(3.2 / 5–然而阐明交叉链接),尽pipe我认为这并不完全清楚,因为它将“专业化”定义为“阶级,职能或阶级成员“,这(3)不满足。

模板类与模板方法devise模式相关 ,而类模板只是一个“填充空白”类模板。

C ++的创build者Bjarne Stroustrup在他的着作The C ++ Programming Language第4版 23.2.1定义模板中说:

有些人在术语类模板模板类之间进行语义区分。 我不; 这太微妙了:请考虑这些条款是可以互换的。 同样,我认为function模板可以与模板function互换。

模板类(Template class):具有通用定义的类或带有参数的类,直到客户端提供信息才会实例化。 它被称为纯模板的行话。简单的类与前缀模板和使用T。 类模板:类的单独构造是由类模板指定的,类模板与通过使用类构build单个对象的方式几乎相似。 它被称为模板类的对象Ex-类名对象名(参数列表)

类模板是不同types对象的通用类。 基本上它提供了一个基于参数生成类的规范。 每当一个新的对象被创build时,一个新的类将出现在内存中。 这被称为实例化类模板,并且该类的每个实例化版本被称为模板类。