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

时间:2009-05-18 20:07:07

标签: c++

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

7 个答案:

答案 0 :(得分:111)

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

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

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

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

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

答案 1 :(得分:11)

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

标准没有它的概念,所以由其他人来做出改变。有些人同义地使用它,而其他人说术语“模板类”指的是实例化或显式专用的类模板,这将使其等同于术语“类模板专门化”。从历史上看,它具有这种意义。 Annotated Reference Manual在第343页定义

  

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

非终端 template-class-name 等同于今天标准中使用的非终端 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)没有定义类,而是定义了一个模板。
  • 当前标准调用类(2),以及由(4)和(5)类模板特化生成的类。并且(3)被称为部分特化,而不是显式特化。它有时也称(3)专业化(3.2 / 5 - 但澄清交叉链接),虽然我发现这对我来说并不完全清楚,因为它将“专业化”定义为“类,功能或类”会员“,其中(3)不满足。

答案 2 :(得分:8)

C ++的创建者Bjarne Stroustrup在他的书“ C ++编程语言第4版”中说,23.2.1定义模板:

  

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

答案 3 :(得分:7)

模板类与Template Method design pattern相关,而类模板只是一个“填空”类模板。

答案 4 :(得分:1)

类模板是用于生成类的模板,而模板类是由模板生成的类。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

看看this paper(from wg21 and was published in 1992)

  

一致的术语

     

迄今为止的许多争论和分歧都与描述模板的章节中使用的术语有关。最常见的是&#39;功能模板&#39; &#39;模板功能&#39; 的不同应用,以表达不同的想法和意图。由于没有应用一致的命名,结果就是混乱和争论。

     

就本文件而言,作为委员会在讨论模板时正式通过的提案,以及澄清文件的目的;我建议采用形式化,尾随&#39; -template&#39; 描述模板描述的一组类型或功能。并且领先的模板 - &#39; 用于描述&#39; -template&#39; 的部分模板定义,例如'template-member-function'。因此: -

     
      
  • &#39; function-template&#39; :由模板描述的一组函数,对作为该模板的参数提供的某些类型信息进行参数化。   例如: -
  •   
template<class T> int nullcheck( T* pT )
{ return ( pT != 0 ); }
  
      
  • &#39; class-template&#39; :由模板描述的一组类,参数化作为该模板的参数提供的某些类型信息。对于   示例: -
  •   
template<class T> class S {
int i;
public:
int sep_member();
int imm_member()
{ return 2; }
}
  
      
  • &#39;模板功能&#39; :不再允许此字词。**
  •   
  • &#39; template-class&#39; :不允许使用此字词。**

  •   
  • &#39; member-function-template&#39; :不允许使用此术语,因为它描述了模板定义当前不支持的属性。使用   在上面的术语惯例中,这将描述一个成员   一个非类模板,其定义本身就是一个   模板。例如: -

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

但是,由于模板目前仅限于全局   范围,这样的模板无效。

     
      
  • &#39;模板静态成员函数&#39;:
  •   
  • &#39;模板成员函数&#39;:
  •   
  • &#39;模板静态部件&#39;:
  •   
  • &#39;模板静态数据成员   的&#39;模板构件&#39;:   出现成员定义的替代术语   分离到&#39;类模板&#39;它属于哪个。对于   例如: -
  •   
template<class T> int S<T>::sep_member()
{ return i; }