模板初阶(函数模板、类模板)

泛型编程

1、泛型编程:不在针对某种类型,能适应广泛的类型

在这里插入图片描述

函数模板

函数模板的概念

在这里插入图片描述
在这里插入图片描述

(1)Swap(a,b)、Swap(c,d)调用的是不同的函数
在这里插入图片描述
(2)自定义类型也可以推到,只要自定义类型赋值重载了就行
(3)在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此

在这里插入图片描述

函数模板的实例化

std库里面有swap直接用
在这里插入图片描述

函数模板并不是真正用的函数,只是能通过函数模板去看实现逻辑。
真正的函数还需要,实参传给形参,传参之后编译器进行推导,函数实例化
就行活字印刷术的雕版

类模板

在这里插入图片描述在这里插入图片描述

类模板不需要传参,类模板的实例化需要显示实例化

注意
(1)函数模板一定是推导出来的,类模板一定是显示实例化的吗?
在这里插入图片描述
(2)模板参数也是有缺省参数的
模板参数很多时候和函数参数很像
模板参数—传递的是类型
函数参数—传递的是对象值
在这里插入图片描述
(3)声明和定义分离(模板不支持声明定义放到两个文件中(.h、.cpp),会出现连接错误,一般放到一个当中,命名为.hpp,并不是.hpp命名,.h也是可以的)

函数模板的声明定义分离
在这里插入图片描述
在这里插入图片描述
类模板声明和定义分离

在这里插入图片描述
在这里插入图片描述

(1)模板类指明类域 类名<模板参数>
(2)每次用模板前面都有加 template< [typename | class] 模板参数名>

声明定义分离会出现连接错误,为什么?符号表中找不到(所有的链接错误都是符号表中找不到),为什么呢?
实例化的问题
在这里插入图片描述
在这里插入图片描述
声明和定义分离,template.cpp在形成连接表的时候,由于并不知道传的参数是什么类型,无法实例化出函数,因此形成的函数连接表是空的;
而当test.cpp中使用这么模板的时候,回去连接表中找call的函数,但是连接表为空,因此链接错误

解决方案
方案一:在template.cpp中显示的实例化
在这里插入图片描述
方案二:模板的声明定义写在一个文件中

模板一些常见问题

1、
在这里插入图片描述
解决方案一:在这里插入图片描述
解决方案二:在这里插入图片描述

2、
在这里插入图片描述

(1)有现成的就会去调用现成的,而不是编译器自己再去生成
(2)如果不想让编译器调用现成的,而是让编译器自己生成——可以显示实例化
在这里插入图片描述

3、模板的处理在:编译
4、也可以有多个模板参数
在这里插入图片描述

多个模板参数也可也显示实例化
在这里插入图片描述

5、模板参数也可也缺省

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值