函数模板和模板函数的关系 函数模板 max (X, 实例化 实例化实例化实例化 模板函数 模板函数 模板函数 模板函数 max(il, 12) max(f1, f2 max(d1, d2) max(cl,C (1,i2为整型)(f1,2.浮点型(d1,d2为双精型‖(c1,c2为字符型 例6.2与指针有关的模板 include<iostream.h> template<class T> T sum(T*array, int size=0) T total=O 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,345,6,7,8,9,10} double double_ array={11,22,3344,5.5,6.67788,9.9,10.10}; void maino int itotal=sum int_ array, 10) double dtotal=sum(double- array, 10) cout<< The summary of integer array are <<itotal<<endl; cout≤s” The summary of double array are:"<< dtotal≤<endl; 程序运行结果为: 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 maino 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> int il:;∥错误,不允许有别的语句 T max(TX,T y i return(x>y)? x: y;] (3)模板函数类似于重载函数,只不过它更严格一些而已。函数被重 载的时候,在每个函数体内可以执行不同的动作,但同一函数模板 实例化后的所有模板函数都必须执行相同的动作。 ∥不能做函数模板的 void outdate int i) i cout≤si;} void outdata double d) cout<”d=”<<d≤endl;} 8
⑵在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) t max i, i) ∥确,调用max(int;int) max(c,c);∥正确,调用max(char,char) max(i, c) ∥误 max(c, i) ∥误 这里出现错误的原因是,如对语句max(i,c) 编译器将先按变量i将T解释为in类型,此后出现的模板实参c不能 解释为int类型时,便发生错误。解决这个问题有以下两种方法 (1).用强制类型转换,如将调用语句 max(i,c);改写成max(,int(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