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

cod*_*der 79 c++

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

Not*_*ure 113

对于许多人来说,这是一个常见的混淆点(包括维基百科上的通用编程页面,一些C++教程以及此页面上的其他答案).就C++而言,没有"模板类"这样的东西,只有"类模板". 读取该短语的方式是"类的模板",而不是"函数模板",它是"函数的模板". 再次:类不定义模板,模板定义类(和函数).例如,这是一个模板,特别是一个类模板,但不是一个类:

template<typename T> class MyClassTemplate
{ 
    ...
};
Run Code Online (Sandbox Code Playgroud)

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

短语"模板类"没有任何意义,因为就"C++"而言,"模板"一词在应用于名词"类"时没有作为形容词的含义.它意味着一个的存在(或限定)一个模板,这是不存在在C++概念.

我理解常见的混淆,因为它可能基于这样的事实:单词出现在实际语言中的"模板类"的顺序中,这是另一个故事.

  • **−1** 术语表示它们对使用这些术语的人的意义。开始分析字面意义是没有意义的。只需尝试使用日常生活或工程中的任何其他术语即可。总结一下,这个答案是胡说八道。[SHH 的回答](http://stackoverflow.com/a/39681575/464581),引用 Bjarne 的话是可以的。 (3认同)
  • ISO C++ wiki FAQ 也犯了这个错误。在 https://isocpp.org/wiki/faq/templates#templates-defn-vs-decl 中,甚至有一个令人不安的“给专家的注释”,表明作者知道其中的差异。 (3认同)
  • @j_random_hacker - 请参阅下面 litb 的答案,但简而言之,首选术语是“类模板专业化” (2认同)
  • @j_random_hacker:它有一个合适的术语 - "显式类模板特化"和"部分显式类模板特化".繁琐,但不含糊:) (2认同)

Joh*_*itb 11

不同之处在于术语"模板类"在C++标准中根本不存在.这个词主要被那些认为"类模板"这个词混淆的人使用(比如Qt公司的诺基亚和以前的奇趣科技).

标准没有它的概念,所以它取决于其他人.有些人同义地使用它,而其他人说术语"模板类"指的是实例化或显式专用的类模板,这将使其等同于术语"类模板专门化".从历史上看,它具有这种意义.该注释的参考手册定义的343页

从类模板生成的类称为模板类,特别是使用template-class-name作为其名称定义的类

非终端模板类名称相当于今天标准中使用的非终端模板ID,并且下降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; };
Run Code Online (Sandbox Code Playgroud)
  • ARM称为类(2),由(4)和(5)生成的类是模板类.我不确定ARM是否已经知道部分专业化.但是如果是这样的话(3)并没有被称为模板类,因为(3)没有定义类,而是定义了一个模板.
  • 当前的Standard调用class(2),以及由(4)和(5)类模板特化生成的.并且(3)被称为部分特化,而不是显式特化.它有时也称(3)专业化(3.2/5 - 但澄清交叉链接),虽然我发现这对我来说并不完全清楚,因为它将"专业化"定义为"类,功能或类"会员",其中(3)不满足.

  • 呵呵.是的,还有其他几个人也为这一组做出了贡献.特别是C++ Faq lite和Qt文档.faq lite的作者在邮件中告诉我,他想要另外一个FAQ项目,解释说使用"specialization"这个词更好,因为它会减少混淆(对于用户编写的专业化类型使用"显式专业化",然后).Qt的人告诉我他们不想使用"类模板"这个词......他们发现它太"不自然"了.太糟糕了. (3认同)

SHH*_*SHH 9

C++的创建者Bjarne Stroustrup在其着作"C++编程语言"第4版,23.2.1定义模板中说:

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


Pet*_*háč 7

模板类与模板方法设计模式相关,而类模板只是"填空"类模板.