■ 有时,编译程序无法根据调用时的实参类型来确定 所调用的模板函数,这时,需要在程序中显式地实 例化函数模板。例如: template <class T> T max(T a,T b) return a>b?a:b; X int X,y,Z; double I,m,n; z=max(x,y);/调用模板函数:int max(inta,intb) 'a,eeS/阀n毯板函数:double max((double 问题:max(x,m)调用哪一个模板函数?
◼ 有时,编译程序无法根据调用时的实参类型来确定 所调用的模板函数,这时,需要在程序中显式地实 例化函数模板。例如: template <class T> T max(T a, T b) { return a>b?a:b; } ...... int x,y,z; double l,m,n; z = max(x,y); //调用模板函数:int max(int a,int b) l = max(m,n); //调用模板函数:double max(double a,double b) 问题:max(x,m) 调用哪一个模板函数?
解决办法: ■显式类型转换 max((double)x,m); 或 max(x,(int)m); 显式实例化 max<double>(x,m); 或 max<int>(x,m); 再定义一个max的重载函数 double max(int a,double b) return a>b?a:b;
解决办法: ◼ 显式类型转换 max((double)x,m); 或 max(x,(int)m); ◼ 显式实例化 max<double>(x,m); 或 max<int>(x,m); ◼ 再定义一个max的重载函数 double max(int a,double b) { return a>b?a:b; }
除了类型参数外,函数模板也可以带有非类型 参数,使用时需要显式实例化。例如: template≤class T,int size>/size为一个int型的普通参数 void f(T a) T temp[size]; f<int,10>(1);/调用模板函数f(inta),其中的size为10
◼ 除了类型参数外,函数模板也可以带有非类型 参数,使用时需要显式实例化。例如: template <class T, int size> //size为一个int型的普通参数 void f(T a) { T temp[size]; ...... } ...... f<int,10>(1); //调用模板函数f(int a),其中的size为10
类模板 ■如果一个类的成员的类型可变,则该类称为类属类。 在C++中,类属类用类模板实现。 template <class T> class Stack T buffer[100]; int top; public: Stack()top =-1; void push(const T &x); void pop(T&x)月 }; template <class T> void Stack <T>:push(const T &x){......} template <class T> void Stack <T>::pop(T &x){......}
类模板 ◼ 如果一个类的成员的类型可变,则该类称为类属类。 在C++中,类属类用类模板实现。 template <class T> class Stack { T buffer[100]; int top; public: Stack() { top = -1; } void push(const T &x); void pop(T &x); }; template <class T> void Stack <T>::push(const T &x) { ...... } template <class T> void Stack <T>::pop(T &x) { ...... }
■类模板的格式为: template <class T1,class T2,...> class<类名> {<类成员说明> 其中,T1、T2等为类模板的类型参数,在类成员 的说明中可以用T1、T2等来作为它们的类型
◼ 类模板的格式为: template <class T1,class T2,...> class <类名> { <类成员说明> } • 其中,T1、T2等为类模板的类型参数,在类成员 的说明中可以用T1、T2等来作为它们的类型