C++ C+中的泛型类+;
我在读泛型类这个主题。有一点我被卡住了。下面是一段代码C++ C+中的泛型类+;,c++,C++,我在读泛型类这个主题。有一点我被卡住了。下面是一段代码 template <class StackType> class stack { StackType stck[10]; int tos; public: stack() {tos=0;} void push(StackType ob); StackType pop(); }; 模板类堆栈 { StackType stck[10]; int tos; 公众: 堆栈(){tos=0;} 空
template <class StackType> class stack
{
StackType stck[10];
int tos;
public:
stack() {tos=0;}
void push(StackType ob);
StackType pop();
};
模板类堆栈
{
StackType stck[10];
int tos;
公众:
堆栈(){tos=0;}
空推(StackType ob);
StackType pop();
};
我的问题是在模板类堆栈中
,
有两个类(StackType
和stack
)
我的意思是,编译器如何将其视为使堆栈成为StackType的嵌套类或其他东西?类
内部的
与外部的含义不同。它本质上与typename
相同,它不是创建第二个类,而是创建一个类型堆栈类,其中StackType被用户给定的类型取代。更好的定义方法是使用typename(§14.1.2),这使得实际发生的事情更加清楚。有关模板的详细信息,请参见
您所描述的是模板中的嵌套类:
template <typename Type>
class Stack
{
public:
class InnerType
{
};
};
模板
类堆栈
{
公众:
类内部类型
{
};
};
在本例中,InnerType是一个强名称为Stack::InnerType
的类,它是基于提供的类型的特定类。因此,如果代码中的某个地方创建了一个对象,如下所示:
auto x = new Stack<int>();
auto x=新堆栈();
然后将存在类型为Stack::InnerType
的类。模板类仅在代码中使用时才存在于程序集中,因此如果未实现任何堆栈
变体的对象,则内部类型
(任何模板类型)将不存在
另外,关于声明模板的更多详细信息是。,因此模板不是类。这是模板从用户定义的类型(例如int)生成类的一种方法。因此,当我说:
stack<int>
编译器将生成两个类stact
和stack
模板创建一系列类-每个类具有相同的功能,但操作的类型不同
在您的示例中,它正在创建一个类族。e、 g.X类堆栈、Y类堆栈等。没有第二类StackType
是模板参数。你可以这样想,就像你考虑一个函数的一个参数一样。除非调用并提供其参数,否则函数无法执行任何操作。与模板类堆栈类型
相同,它是模板类型堆栈
的类型参数。当您向模板类提供类型[name]作为参数时,您将专门化模板类。所有这些参数和专门化都发生在编译时。例如,当编译器第一次遇到
stackstackVariable
或
typedef stackstackofits
只有这样,它才真正编译并建立一个名为堆栈
的类型,即整数堆栈。在那之前,什么都没有
使用int
实例化后,您的类变成:
template<>
class stack< int >
{
int stck[10];
int tos;
public:
stack() {tos=0;}
void push(int ob);
int pop();
};
模板
类堆栈
{
int-stck[10];
int tos;
公众:
堆栈(){tos=0;}
无效推力(int ob);
int-pop();
};
StackType在本例中指的是堆栈将包含的内容类型。如果你创建一个堆栈,你将有一个整数堆栈。好的,我得到了它,但是我们应该初始化StackType(){tos=0;}而不是stack(){tos=0;}。不是吗?不,StackType只是数组stck的数据类型。字段tos是Stack类的一部分,因此您的示例正确地初始化了它。为什么在示例中使用new
?当然,这可以通过使用Stack变量(例如Stack a();
)来说明,但在演示构造函数使用堆分配(new)时,这是一种惯例。
template<>
class stack< int >
{
int stck[10];
int tos;
public:
stack() {tos=0;}
void push(int ob);
int pop();
};