//template <模板参数表> //类声明 //定义一个类模板与定义函数模板的格式类似,必须以关键字template开始,后面是尖括号括 起来的模板参数,然后是类名,格式如下 // template<class Type> // class 类名 { // //... // }; //其中template是一 个声明模板的关键字,它表示声明一个模板. class 表示后边的 type 是类模板参数 //在类定义中,欲采用通用数据类型的数据成员、成员函数的参数或返回值,前面需加上Type //在类定义体外定义成员函数时,若此成员函数中有模板参数存在,则需要在函数体外进行模板声明,并且在函数名前的类名后缀上"<Type>" //例如,成员函数在类定义体外定义为: // template<class T> //T complex<T>:: realcomplex() //{return real;} //类模板不代表一个具体的、实际的类,而代表着一类类。实际上,类模板的使用就是将类模板实例化成一个具体的类,它的格式为: //类名<实际的类型>对象名; //例如,使用上面的类模板,创建两个模板参数为double型的对象,语句如下: //complex<double> s1,s2; //创建两个模板参数为int型的对象: //complex<int> s1,s2; #include <iostream.h> #include <stdlib.h> // 结构体Student struct Student { int id; //学号 float gpa; //平均分 }; //类模板:实现对任意类型数据进行存取 template <class T> class Store { private: T item; //用于存放任意类型的数据 int haveValue; //用于标记item是否已被存入内容 public: Store(void); //缺省形式(无形参)的构造函数 T GetElem(void); //提取数据函数 void PutElem(T x); //存入数据函数 }; // 缺省形式构造函数的实现 template <class T> Store<T>::Store(void): haveValue(0) {} template <class T> //提取数据函数的实现 T Store<T>::GetElem(void) { //如果试图提取未初始化的数据,则终止程序 if (haveValue == 0) { cout << "No item present!" << endl; exit(1); } return item; //返回item中存放的数据 } template <class T> //存入数据函数的实现 void Store<T>::PutElem(T x) { haveValue++; //将haveValue 置为 TRUE,表示item中已存入数值 item = x; //将x值存入item } int main(void) { Student g= {1000, 23}; Store<int> S1, S2; Store<Student> S3; Store<double> D; S1.PutElem(3); S2.PutElem(-7); cout << S1.GetElem() << " " << S2.GetElem() << endl; S3.PutElem(g); cout << "The student id is " << S3.GetElem().id << endl; cout << "Retrieving object D " ; cout << D.GetElem() << endl; //输出对象D的数据成员 return 0; }