我正在阅读Generic Classes主题.我一度陷入困境.以下是一段代码
template <class StackType> class stack
{
StackType stck[10];
int tos;
public:
stack() {tos=0;}
void push(StackType ob);
StackType pop();
};
Run Code Online (Sandbox Code Playgroud)
我的问题是template <class StackType> class stack,有两个类(StackType和stack)?
我的意思是编译器如何将其视为使堆栈成为StackType的嵌套类或其他东西?
它不是创建第二个类,而是创建一个Stack类型,其中StackType被用户给定的类型取代.定义它的更好方法是使用typename(§14.1.2),这样可以更清楚地了解实际情况.有关模板的更多信息,请参阅C++模板.
您所描述的是模板中的嵌套类:
template <typename Type>
class Stack
{
public:
class InnerType
{
};
};
Run Code Online (Sandbox Code Playgroud)
在此示例中,InnerType是一个强名称的类Stack<Type>::InnerType,它是基于提供的类型的特定类.因此,如果代码中的某个位置创建了一个对象,如下所示:
auto x = new Stack<int>();
Run Code Online (Sandbox Code Playgroud)
然后Stack<int>::InnerType会存在一类类型.模板类仅在代码中使用时才存在于程序集中,因此如果没有实现任何变体的对象Stack,则InnerType(任何模板类型)都不存在.