类模板和模板类之间是否存在差异。如果是这样的话是什么?
答案 0 :(得分:10)
当使用这两个术语时,存在非常微妙的差异。它比语义更具语言性,它取决于你正在修改哪个词。
简而言之,类模板是一种特殊的模板。模板可以定义类或函数。类模板是定义类的模板。看到差异:
template <typename T> class SomeClass {...}; // this is a class template
template <typename T> int some_function(T&) {...} // this is a function template
模板类是一种特殊的类。类有很多种,特别是模板类是使用类模板定义的类。对比:
SomeClass sc; // SomeClass is an ordinary (non-template) class
SomeClass<int> sc; // SomeClass<int> is a template class
模板类 - 按类型,值或模板参数化的类。该 标识要为其生成的类所必需的模板参数 必须在使用模板类的地方提供类模板。对于 示例“
vector<int> v;
”从向量生成一个int向量 模板。另见模板。 TC ++ PL 13.2,D&amp; E 15.3。
直到1998年,这两个表达式都用在Stroustrup的书“C ++编程语言”和ISO / IEC C ++标准中。
注意:正如下面的评论中所讨论的,似乎C ++ 03不再使用术语“模板类”了(虽然我没有它的副本),大概是为了减少混乱。正如我之前所说,它们基本上是相同的,它只是语言上的差异:在模板上下文中,您引用特定类型的模板,或者在类上下文中引用特定类的类。如果你只是坚持“课堂模板”,你就不会失去任何东西。
更多值得深思的话:
答案 1 :(得分:3)
这个问题也在关于C ++模板的权威书籍{"C++ Templates: The Definitive Guide", by Vandvoorde and Josuttis),第7.1节,第87页(至少在我的版本中)中得到了具体解决:
7.1“类模板”或“模板类”?
[剪断]
关于如何做一些混乱 作为模板的类被称为:
术语类模板表明了这一点 该类是一个模板。这就对了 是a的参数化描述 班级家庭。
另一方面,术语模板类 手已被使用
作为课程模板的同义词。
引用从模板生成的类。
引用名称为template-id的类。
第二和第二的区别 第三个含义有点微妙 其余部分不重要 文本。
由于这种不精确,我们避免 本书中的术语模板类。
同样,我们使用功能模板 和成员函数模板,但是 避免模板功能和模板 会员职能。
(任何人,我的意思是任何人,使用C ++模板应该有本书的副本。)
答案 2 :(得分:1)
不,这两个术语指的是同一件事。在这两种情况下,它都是一个定义为:
的类template<typename T> class Foo {};
这与刚刚声明为:
的常规类形成对比class Foo {};
如果你认为它是一种特殊的类,那么“模板类”是有意义的。如果您认为“类模板”实际上不是一个类,而是一个类类的模板,那么“类模板”是有意义的。后者更准确,因为在模板实例化之前不存在实际的类,例如:
Foo<char> x;
答案 3 :(得分:1)
类模板是用于创建类的模板。模板类是作为模板实例化创建的类。
答案 4 :(得分:1)
我认为class template
是一种模板,template class
是从class template
实例化的类。
答案 5 :(得分:1)
现在由于C ++的影响,这两者可以互换使用。在过去,C ++之前的模板,模板类是面向对象设计术语的一部分。模板类背后的想法是它形成了执行框架,其中包含明确定义的,被覆盖的“热点”(实现中的虚拟方法),子类将提供功能。效果类似于以下伪代码:
class templateClass:
public:
virtual hotSpotA: nil
virtual hotSpotB: nil
method templateExecute:
do some stuff
hotSpotA
do some other stuff
hotSpotB
do even more stuff
然后,您将使用此模板类继承并实现hotSpots:
class templateClient from templateClass:
public:
override hotSpotA:
client-specific stuff A
override hotSpotB:
client-specific stuff B
client = new templateClient
client.templateExecute
许多设计元模式依赖于这种结构(事实上,如果你看大多数OO设计模式,你会看到这种结构以各种形式一直使用)。
现在你不会再看到这个术语了,因为C ++的恶毒影响。我不确定这个元模式结构的当前术语是什么,因为除非被迫使用它,否则我几乎完全放弃了OOP。
如果你想阅读它,有一本书非常详细地解释了这个(和其他元模式):Design Patterns for Object-Oriented Software Development
答案 6 :(得分:0)
What is the difference between a template class and a class template?
What is the difference between a template function and a function template?
问题是:正在修改什么?一般来说,如果我们说某事物是“温室”,那么物体就是房子,那恰好是绿色的。考虑到这一点,这显然是一个类:
struct SomeClass {
int i;
};
虽然这显然是一个模板:
template <typename T>
struct cTemplate {
int member;
};
它是什么样的模板? c模板类模板。沿着这些方向,这是一个功能:
void foo() {}
这是一个模板:
template <typename T>
T fTemplate(T arg)
{
return arg * arg;
}
它是什么样的模板? fTemplate是一个功能模板。
现在,SomeClass是一个类名,因此我们可以编写如下内容:
SomeClass sc;
沿着这些方向,我们知道我们可以做一些事情,例如:
cTemplate<int> cti;
换句话说,cTemplate也是一个类名。所以,cTemplate是一个类。想想看,它实例化时会有效:
template <> struct cTemplate<int> {
int member;
}
这是什么课?好吧,可能没有必要对哪种类型进行限定,但如果是,那么cTemplate似乎就是模板类。同样,有功能。也就是说,如果要调用fTemplate,例如:
fTemplate(99.99);
然后在实例化一个函数之后:
fTemplate<double>(double)
特别是:
template <>
double fTemplate<double>(double)
{
return arg * arg;
}
所以,如上所述,如果按下这是什么样的功能,似乎可以说这是一个模板功能。
以上都说,事实证明有些人使用模板类来表示与类模板相同的东西,因此,一些(其他)人不喜欢在前一个术语上放置特定含义。