模板类和类模板有什么区别?
Answers:
这是很多人的困惑点(包括Wikipedia的“通用编程”页面,一些C ++教程以及此页面上的其他答案)。就C ++而言,没有“模板类”之类的东西,只有“类模板”。 读取该短语的方式是“类的模板”,而不是“功能模板”,即“功能模板”。 再次:类不定义模板,模板定义类(和函数)。例如,这是一个模板,特别是一个类模板,但它不是一个类:
template<typename T> class MyClassTemplate
{
...
};
该声明MyClassTemplate<int> 是一个类,或者根据模板是一个简单的类。 与基于模板的类相比,基于模板的类没有特殊的属性。 特殊属性是模板本身的属性。
短语“模板类”没有任何意义,因为就C ++而言,“模板”一词在用于名词“类”时作为形容词没有任何意义。它意味着一个的存在类即是(或限定)一个模板,这是不存在于C ++的概念。
我理解常见的混淆,因为这可能是基于单词以实际语言以“模板类”的顺序出现的事实,这完全是另外一回事了。
区别在于,术语“模板类”在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; };
模板类与“模板方法”设计模式有关,而类模板只是“填空”类模板。
类模板是用于生成类的模板,而模板类是由模板生成的类。
一致的术语
迄今为止,许多争论和分歧都与描述模板的章节中使用的术语有关。最常见的是使用“功能模板”和“模板功能”来表达不同的想法和意图。由于未应用一致的命名,因此导致混淆和争论。
就本文件而言,是供委员会在讨论模板时正式采用的提案,并用于澄清文件;我建议我们采用形式化,即尾随的“-模板”描述模板描述的一组类型或功能。这一个领先的“模板- ”,用来描述中的一部分模板定义“-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您在上面描述的类:我不知道这样的成员函数模板是被禁止的。我尝试过的所有编译器都接受它。我想念什么?