泛型编程
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、模板参数也可也缺省