这次我们来介绍一下类模板:
类模板的定义形式
template<class Type>
class ClassName
{
//具体内容
};
或:
template <typname Type>
class ClassName
{
//具体内容
};
类模板成员函数的类外定义形式
template<模板参数表>
<函数类型><类模板名><模板参数表>::成员函数名(函数形参表)
{
//函数体
}
注意:这里模板参数表是类的模板参数表。
类模板的实例化
类模板名 <类型实参表>对象名表(比如stack,stack…)
实例:
#include<iostream>
using namespace std;
template<class T>
T prints(T x){
cout<<"That is OK"<<endl;
return x;
}
template<class T>
class stack
{
private:
T size[20];
int p;
public:
void init()
{
p = 0;
prints(p);
}
};
int main()
{
stack<int *> h;
h.init();
return 0;
}
注意点:
1、类型实参表必须放在一对尖括号中,类型实参可以是标准型,也可以是用户定义的类型,其个数必须与定义类模板时“模板参数表”中模板形参的个数相同。
2、类模板本身不是类,编译器通过类模板创造类。
3、类模板中可以使用函数模板,但是函数模板要定义在类模板前。
4、在每个类模板定义前,都需要在前面加上模板声明,如:template<class type>
5、模板类中可以有多个模板参数。
6、类模板与自己定义的类如果同名系统会报错(类不能重载原则)。也就是说,在实例中,你如果再定义一个class stack{.....};
系统会报错。
7、你可以在类里面定义模板函数,你甚至可以在类模板里定义函数模板。,但是要注意一个细节,就是在类模板里定义函数模板时,类型T已经在模板类的头语句templete<class T>
中定义过了,这时函数模板的头语句再写templete<class T>
系统会报错。
template<class T>
class stack
{
private:
T size[20];
int p;
public:
void init()
{
p = 0;
prints(p);
}
template <class H>
H sss(H s){
return s;
}
};//这是正确的
template<class T>
class stack
{
private:
T size[20];
int p;
public:
void init()
{
p = 0;
prints(p);
}
template <class T>
T sss(T s){//这时会报错,因为重复定义。
return s;
}
};