类模板的声明和函数模板很相近,我们先声明作为类型参数的标识符,我们使用T作为标识符。
template <typename T>
class 类名{
.....
};
在此可以使用关键字class来替代typename
template <class T>
class 类名{
.....
};
在类模板的内部,T可以像其他任何类型一样,用于声明成员变量和成员函数。在下面的例子中T被用于声明vector的元素类型,声明push是一个接收常量T引用为唯一实参的成员函数,声明top()是返回类型为T的成员函数。
template <typename T>
class Stack
{
private:
std::vector<T> elems; //存储元素的容量
public:
Stack(); //构造函数
void push(T const &); //压入元素
void pop(); //弹出元素
T top() const; //返回栈顶元素
};
这个类的类型是Stack<T>,其中T是模板参数。因此,当在声明中需要使用该类的类型时,你必须使用Stack<T>。例如,要声明自己实现的拷贝构造函数和赋值函数时,那么应该这样编写:
class Stack
{
...
stack(Stack<T> const &); //拷贝构造函数
stack<T> &operator=(Stack<T> const &); //赋值运算符
...
};
然而,当使用类名而不是类的类型时,就应该只用Stack;譬如,当你指定类的名称、构造函数、析构函数时,就应该使用Stack。