模板类和类模板有什么区别?
答案 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; };
答案 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; }