函数模板与模板函数

函数模板与模板函数
  • 函数模板是一组函数的抽象描述,它不是一个实实在在的函数,函数模板不会编译成任何目标代码。函数模板必须先实例化成模板函数,这些模板函数再程序运行时会进行编译和链接,然后产生相应的目标代码。
函数模板的异常处理
  • 函数模板中的模板形参可实例化为各种类型,但当实例化模板形参的各模板实参之间不完全相同,就可能发生错误,如:
 template < class T>
 void min(T& x,T& y)  //函数模板
 {  
 	return (x<y)?x:y;  
 }
 void func(int i,char j)
 {
 	min(i,i);  //实例化的模板函数,正确调用
 	min(i,j);  //实例化的模板函数,但错误调用
 }
  • 上述代码中,min(i,i)的调用是正确的,而min(i,j)的调用是错误的。因为在函数模板中声明了min的两个参数必须是同一个类型,在调用时,编译器会对所有模板函数进行一致性检查。例如min(i,j)在编译时,编译器先将模板形参T解释为int类型,此后出现的模板形参j却为字符型,所以编译产生错误,此时没有隐含的类型转换功能。

  • 解决此种异常的方法有两种:
    1.采用强制类型转换,将min(i,j)改写为min(i,(int)j)。
    2.用非模板函数重载函数模板,方法有两种:

①.借用函数模板的函数体。此时只声明非模板函数的原型,它的函数体借用函数模板的函数体,如:

template < class T>
void min(T& x,T& y)    //函数模板
{  
	return (x<y)?x:y;  
}
int min(int,int);      //非模板函数重载函数模板解决异常问题
void func(int i,char j)
{
	min(i,i); 
	min(i,j);  
}
 //这时执行不会出错,因为重载函数支持数据间的隐式类型转换。

②.重新定义一个完整的非模板函数。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
函数模板模板函数是 C++ 中用于创建通用代码的关键特性,它们都允许程序员编写可以处理不同数据类型的函数。然而,两者之间存在一些关键的区别。 **联系:** 1. **目的相同**:函数模板模板函数的共同目标都是提高代码的复用性和灵活性,通过类型推导机制处理不同类型参数。 2. **编译时间处理**:在编译阶段,模板都会被展开为特定类型的函数实例。 **区别:** 1. **定义位置**:函数模板是在声明中定义的,使用尖括号 `< >` 包裹,如 `template<typename T> void func(T param)`;而模板函数是定义(包括实现)在声明中的,通常用`=0`表示默认实现,如`void func(T param) = 0`。 2. **实例化**:模板被实例化时会为特定类型创建一个新的函数,这被称为模板实例化;而模板函数本身不会实例化,直到实际调用时才会根据传入的具体类型生成相应版本的函数。 3. **可选实现**:对于模板函数,如果提供了一个非默认的实现,那么这个实现会在所有模板实例中都被调用;而对于模板,如果没有为特定类型提供实现,编译器将生成一个未定义的行为。 4. **模板函数的重载**:模板函数不能直接与其他函数重载,但可以与模板函数实例重载;而函数模板可以与其他函数(包括其他模板实例)进行重载。 **相关问题--:** 1. C++中的模板函数是如何工作的? 2. 何时会选择使用函数模板而不是模板函数? 3. C++如何处理未提供实例化的模板函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值