1.模板的用处
模板可以减轻我们的负担,可以实现用统一的代码实现不同数据类型的功能。
2.模板类、模板函数、模板结构体的样式
template<class 数据类型参数标识符>
<返回类型><函数名>(参数表)
{
函数体
}
//结构体模板---使用体现:声明结构元素时 StackNode<类型> s;
template<class T>
struct StackNode
{
struct T data;
struct StackNode<T> *next;
};
//类模板---使用体现:声明类对象时 Stack<类型> s;
template<class T>
class Stack
{
public:
T pop();
bool push(T e);
private:
StackNode<T> *p;
}
template<class T>//类模板外的 成员函数实现
T Stack<T>::pop()
{...}
其中,template是定义模板函数的关键字;template后面的尖括号不能省略;class(或typename)是声明数据类型参数标识符的关键字,用以说明它后面的标识符是数据类型标识符。这样,在以后定义的这个函数中,凡希望根据实参数据类型来确定数据类型的变量,都可以用数据类型参数标识符来说明,从而使这个变量可以适应不同的数据类型。
3.使用模板类时要注意的问题
1.函数模板允许使用多个类型参数,但在template定义部分的每个形参前必须有关键字typename或class,即:
template<class 数据类型参数标识符1,…,class 数据类型参数标识符n>
<返回类型><函数名>(参数表)
{
函数体
}
2.在template语句与函数模板定义语句<返回类型>之间不允许有别的语句。如下面的声明是错误的:
template<class T>
int I;
T min(T x,T y)
{
函数体
}
一般写法
1 template <class T>//结构体模板
2 struct node
3 {
4 T data;
5 struct node<T> *lchild;
6 struct node<T> *rchild;
7 };
8 template <class T>//类内类模板
9 class bin
10 {
11 private:
12 node <T> h;
13 public:
14 void pri();
15 };
16 template <class T>//类外成员函数实现模板
17 void bin<T>::pri()
18 {
19 node<T> *p = new node;
20 cout<<"qunimade"<<endl;
21 }
22 int _tmain(int argc, _TCHAR* argv[])
23 {
24 bin<int> abc;
25 }