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();
};