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


85

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

Answers:


125

这是很多人的困惑点(包括Wikipedia的“通用编程”页面,一些C ++教程以及此页面上的其他答案)。就C ++而言,没有“模板类”之类的东西,只有“类模板”。 读取该短语的方式是“类的模板”,而不是“功能模板”,即“功能模板”。 再次:类不定义模板,模板定义类(和函数)。例如,这是一个模板,特别是一个类模板,但不是一个类

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

该声明MyClassTemplate<int> 是一个类,或者根据模板是一个简单的类与基于模板的类相比,基于模板的类没有特殊的属性。 特殊属性是模板本身的属性。

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

我理解常见的混淆,因为这可能是基于单词以实际语言以“模板类”的顺序出现的事实,这完全是另外一回事了。


+1。有时出于任何原因区分一个类的“起源”都是有用的,在这种情况下,您可以合理地使用“模板类”一词-但是出于您给出的原因,仔细定义此含义是个好主意。 。
j_random_hacker,2009年

1
@j_random_hacker-参见下面的litb的答案,但是总之,首选的术语是“类模板专门化”
不确定

@不确定:嗯,实际上我发现“类模板专门化”有点模棱两可,因为它也可以指为模板定义显式或部分专业化的过程-不需要生成实际的“类”。:)恕我直言,“类模板实例化”是最清楚的术语。
j_random_hacker

2
@j_random_hacker:有一个合适的术语-“显式类模板专长”和“部分显式类模板专长”。繁琐,但不明确:)
不确定2009年

1
-1术语是指术语对使用术语的人的含义。开始分析字面意义是没有意义的。只需将其与日常生活或工程学中的任何其他术语结合使用即可。总结起来,这个答案是胡扯。SHH的答案(引用Bjarne)是可以的。
干杯和健康。-Alf

13

C ++的创建者Bjarne Stroustrup在他的《 C ++编程语言》第四版,第23.2.1节中说:

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


12

区别在于,术语“模板类”在C ++标准中根本不存在。这个术语通常被认为“类模板”一词令人困惑的人们使用(例如Qt公司诺基亚和以前的奇趣科技)。

该标准没有它的概念,因此,其他人必须有所作为。有人同义地使用它,而其他人则说术语“模板类”是指实例化或显式专门化的类模板,这将使其等同于术语“类模板专门化”。从历史上看,它具有这个含义。带注释的参考手册在第343页定义

从类模板生成的类称为模板类,以及专门以template-class-name作为其名称定义的类

non-terminal template-class-name等同于当今Standard中使用的non-terminal template-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; };
  • ARM将类(2)以及由(4)和(5)生成的类称为模板类。我不确定ARM是否已经了解部分专业化知识。但是如果这样,则(3)不会称为模板类,因为(3)不会定义类,而是定义模板。
  • 当前的Standard调用类(2),以及由(4)和(5)类模板专门化生成的。与(3)相比,显式专业化称为部分专业化。有时它也称为(3)专业化(3.2 / 5-但是要弄清楚交叉链接),尽管我发现这并不完全清楚,因为它将“专业化”定义为“类,函数或类”成员”,但(3)不满足。

3
呵呵。是的,还有其他几个人也对此做出了贡献。尤其是C ++ Faq lite和Qt文档。常见问题解答的作者在一封邮件中告诉我,他希望再添加一个常见问题解答,解释说使用“专业化”一词比较好,因为它会减少混乱(对于用户编写的专业化,使用“显式专业化”,然后)。Qt的伙计们告诉我,他们不想使用“类模板”一词……他们觉得它太“不自然”。太糟糕了。
Johannes Schaub-litb

@ JohannesSchaub-litb:ARM由Bjarne Stroustrup和Margaret Ellis编写,大约是1991 IIRC。您对ARM的引用SHH对Bjarne的TCPPL第4版的引用相矛盾。因此,最好在旧的(标准前)术语和当前的术语之间进行区分。
干杯和健康。-Alf



0

模板类:具有通用定义的类或带有参数的类,直到客户端提供信息后才实例化该类。它是普通模板的术语。使用前缀模板和T的简单类。类模板:类的单个构造由类模板指定,该模板与使用类构造单个对象的方式几乎类似。引用模板类Ex-classname objectname(参数列表)的对象


0

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


0

看一下这篇论文(来自wg21,发表于1992年)

一致的术语

迄今为止,许多争论和分歧都与描述模板的章节中使用的术语有关。最常见的是使用“功能模板”“模板功能”来表达不同的想法和意图。由于未应用一致的命名,因此导致混淆和争论。

就本文件而言,是供委员会在讨论模板时正式采用的提案,并用于澄清文件;我建议我们采用形式化,即尾随的“-模板”描述模板描述的一组类型或功能。这一个领先的“模板- ”,用来描述中的一部分模板定义“-template”,如'template-member-function'。因此:-

  • 'function-template':由模板描述的一组功能,在作为该模板的参数提供的某些类型信息上具有参数。例如 :-
template<class T> int nullcheck( T* pT )
{ return ( pT != 0 ); }
  • 'class-template':由模板描述的一组类,在作为该模板的参数提供的某些类型信息上具有参数。例如 :-
template<class T> class S {
int i;
public:
int sep_member();
int imm_member()
{ return 2; }
}
  • '模板功能':不再允许使用此术语。**
  • '模板类':不允许使用此术语。**

  • 'member-function-template':不允许使用此术语,因为它描述了模板定义当前不支持的属性。使用以上术语约定,这将描述非类模板的成员,该类的定义本身就是模板。例如 :-

class Normal { public:
template<class T> int foo(T*pT)
{ return ( pT == 0 ); }
};

但是,由于模板当前仅限于全局范围,因此这种模板无效。

  • '模板静态成员功能':
  • '模板成员功能':
  • '模板静态成员':
  • 'template-static-data- member'template-member':成员 定义的替代术语,与它所属的'class-template'分开出现。例如 :-
template<class T> int S<T>::sep_member()
{ return i; }

关于Normal您在上面描述的类:我不知道这样的成员函数模板是被禁止的。我尝试过的所有编译器都接受它。我想念什么?
dan_din_pantelimon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.