// (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; };
9条答案
按热度按时间qyyhg6bp1#
这是一个常见的困惑点,许多(包括Wikipedia上的泛型编程页面、一些C教程以及本页面上的其他答案)。就C而言,没有“模板类”这样的东西,只有“类模板"。阅读该短语的方式是“类的模板”,而不是“函数模板,”这是“函数的模板”。同样:类不定义模板,模板定义类(和函数)。例如,这是一个 * 模板 *,特别是一个 * 类模板 *,但 * 它不是类 *:
声明
MyClassTemplate<int>
是一个类,或者迂腐地说,是一个基于模板的类。 基于模板的类与不基于模板的类没有特殊属性。 特殊属性是 * 模板本身的 *。短语“template class”没有任何意义,因为就C++而言,单词“template”在应用于名词“class”时没有任何形容词意义。它意味着存在一个 class,即是**(或定义)一个 template,这在C++中是不存在的概念。
我理解常见的混淆,因为它可能是基于这样一个事实,即单词在实际语言中以“模板类”的顺序出现,这是一个完全不同的故事。
ujv3wf0j2#
C的创造者Bjarne Stroustrup在他的书 *《C编程语言》第4版 *,23.2.1定义模板中说:
有些人在术语 class template 和 template class 之间进行语义区分。那就太微妙了:请将这些术语视为可互换的。同样,我认为 * 函数模板 * 与 * 模板函数 * 可互换。
ttcibm8c3#
不同的是,C++标准中根本不存在“模板类”这个术语,它主要是被认为“类模板”这个术语容易混淆的人使用的(比如Qt公司Nokia和以前的Trolltech)。
标准没有它的概念,所以要由其他人来做改变。一些人使用它的同义词,而其他人说术语“模板类”指的是示例化的或显式专门化的类模板,这将使它等价于术语“类模板专门化”。历史上,它有这个含义。Annotated Reference Manual定义在第343页
从类模板生成的类称为模板类,特别定义的名称为 template-class-name 的类也称为模板类
非终结符 template-class-name 等效于当今标准中使用的非终结符 template-id,其形式为
template-name < arguments >
。让你熟悉今天的术语,这比使用可疑的旧术语更重要
mlnl4t2r4#
模板类与Template Method design pattern相关,而类模板只是一个“填空”类模板。
dtcbnfnu5#
类模板是用于生成类的模板,而模板类是由模板生成的类。
von4xj4u6#
模板类别:具有泛型定义的类或具有参数的类,在客户端提供信息之前,该类不会示例化。它是指普通模板的行话。简单的类带有前缀template并使用T。类模板:一个类的单个构造由一个类模板来指定,这与使用一个类构造单个对象的方式几乎相似。它引用模板类的一个对象Ex- classname objectname(参数列表)
ckx4rj1h7#
类模板是不同类型对象的通用类。基本上它提供了一个基于参数生成类的规范。每当创建一个新对象时,一个新的类就会在内存中产生。这称为示例化类模板,每个示例化的类版本都称为模板类。
gupuwyp28#
看一看this paper(from wg21 and was published in 1992):
一致的术语
到目前为止,许多争论和分歧都是关于描述模板的章节中使用的术语。最常见的是**'function-template'和'template-function'的不同应用,以表达不同的想法和意图。由于没有应用一致的命名,结果是混乱和争论。
就本文件而言,作为委员会在讨论模板时正式通过的提案,并用于澄清文件;我建议我们采用这样的形式化,即一个尾随的'-template'描述一个模板所描述的一组类型或函数。而一个前导的'template-',用于描述一个'-template'**的一部分的模板定义,例如一个
'template-member-function'
。因此:-但是,由于模板当前仅限于全局范围,因此这样的模板无效。
ecfdbz9o9#
我想标准C++基金会是关于这个主题的最权威的来源:
...模板类(类模板的示例化)...
https://isocpp.org/wiki/faq/templates#templates-defn-vs-decl