函数模板和模板函数的关系 函数模板 max(X, 实例化 实例化实例化实例化 模板函数 模板函数 模板函数 模板函数 max(il, 12) max(f1, f2) max(d1, d2)max(c1, c2 (i1,i2为整型)(f1,f2为浮点型(d1,d2为双精型(c1,c2为字符型 例6.2与指针有关的模板 fincludesiostream,h> template<class T> T sum (T*array, int size=0) T total=0: for(int i=0; i<size; i++)total+=array[i; return total }
函数模板和模板函数的关系 例 6.2 与指针有关的模板 #include<iostream.h> template<class T> T sum(T *array, int size=0) { T total=0; for(int i=0; i<size; i++) total+=array[i]; return total; }; 函数模板 max(x,y) 模板函数 max(c1,c2) (c1,c2为字符型 ) 实例化 5 模板函数 max(f1,f2) (f1,f2为浮点型 ) 模板函数 max(d1,d2) (d1,d2为双精型 ) 模板函数 max(i1,i2) (i1,i2为整型) 实例化 实例化 实例化
接1例6.2 int int array={1,2,34,5,6,78,9,10} double double array={1122,3344,55667788,9910.10} void maino int itotal=sum(int array, 10) double dtotalsum(double array, 10) cout<< The summary of integer array are: <<itotal<<endl cout<<,The summary of double array are: <<dtotal<<end; 程序运行结果为: The summary of integer array are: 55 The summary of double array are: 59.6 几点说明: (1)在函数模板中允许使用多个类型参数。但在 template定义部分的 每个模板形参前必须有关键字 class
接1 例6.2 int int_array[]={1,2,3,4,5,6,7,8,9,10}; double double_array[]={1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,10.10}; void main() { int itotal=sum(int_array,10); double dtotal=sum(double_array,10); cout<<”The summary of integer array are:” <<itotal<<endl; cout<<”The summary of double array are:” <<dtotal<<endl; } 程序运行结果为: The summary of integer array are:55 The summary of double array are:59.6 几点说明: ⑴在函数模板中允许使用多个类型参数。但在template定义部分的 每个模板形参前必须有关键字class。 6
几点说明: 例63 Include<iostream. h> template<class type1, class type2> void myfunc(type1 x, type2 y) cout<<x<<<<y<<end1 void main( myfunc(10,”hao") myfunc(0.123, 10L) 程序运行结果为: 10 hao 0.12310
几点说明: 例6.3 #include<iostream.h> template<class type1, class type2> void myfunc(type1 x,type2 y) { cout<<x<<’’<<y<<end1; } void main() { myfunc(10, ”hao”); myfunc(0.123, 10L); } 程序运行结果为: 10 hao 0.123 10 7
(2)在 template语句与函数模板定义语句之间不允许有别的语句 ∥这是不能编译的 Template <class T> inti;∥错误,不允许有别的语句 T max(Tx,T y) i return(x>y)? x: yi] (3模板函数类似于重载函数,只不过它更严格一些而已。函数被重 载的时候,在每个函数体内可以执行不同的动作,但同一函数模板 实例化后的所有模板函数都必须执行相同的动作。 ∥不能做函数模板的 void outdate(int i) I cout<<i; y void outdata(double d) {cout≤<d=”<≤d<endl;}
⑵在template语句与函数模板定义语句之间不允许有别的语句。 //这是不能编译的 Template <class T> int iI; //错误,不允许有别的语句 T max(T x,T y) { return(x>y)? x : y;} ⑶模板函数类似于重载函数,只不过它更严格一些而已。函数被重 载的时候,在每个函数体内可以执行不同的动作,但同一函数模板 实例化后的所有模板函数都必须执行相同的动作。 //不能做函数模板的 void outdate(int i) { cout<<i; } void outdata(double d) {cout<<”d=”<<d<<endl;} 8
6.2.2函数模板的异常处理 虽然函数模板中的模板形参T可以实例化为各种类型,但实例化T的 各模板实参之间必须保持完全一致的类型,否则会发生错误。请 看下面的例子 Template<class T> T max(Tx,Ty) i return(x>y)?x y; y void fun(int i, char c) i max i, i) ∥l确,调用max( (nt, int max( c, c); ∥l确,调用max(char,char) max i, c) ∥错误 max c, i) ∥错误 这里出现错误的原因是,如对语句max(i,c) 编译器将先按变量i将T解释为int类型,此后出现的模板实参c不能 解释为int类型时,便发生错误。解决这个问题有以下两种方法 (1)采用强制类型转换,如将调用语句 max(c);改写成max(nt(c
6.2.2 函数模板的异常处理 虽然函数模板中的模板形参T可以实例化为各种类型,但实例化T的 各模板实参之间必须保持完全一致的类型,否则会发生错误。请 看下面的例子。 Template<class T> T max(T x,T y) { return(x>y)?x:y; } void fun(int i,char c) { max(i,i); //正确,调用max(int,int) max(c,c); //正确,调用max(char,char) max(i,c); //错误 max(c,i); //错误 } 这里出现错误的原因是,如对语句 max(i,c); 编译器将先按变量i将T解释为int类型,此后出现的模板实参c不能 解释为int类型时,便发生错误。解决这个问题有以下两种方法: ⑴采用强制类型转换,如将调用语句 max(i,c); 改写成 max(i,int(c)); 9