———————————————————————————————————
模板参数分类:1.类型模板参数
2.非类型模板参数(常量--只能是整型常量)
特化:
有全特化和偏特化的区分,偏特化之中又有部分特化限制特化的区分,接下来详细来看:
函数模板特化:
1. 必须要先有一个基础的函数模板( 重要 )2. 关键字 template 后面接一对空的尖括号 <>3. 函数名后跟一对尖括号,尖括号中指定需要特化的类型4. 函数形参表 : 必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误。![]()
类模板特化:
全特化:全特化即是将模板参数列表中所有的参数都确定化。
偏特化:
1.部分特化:将模板参数类表中的一部分参数特化。
2.更进一步的去限制参数:
偏特化并不仅仅是指特化部分参数,而是针对模板参数更进一步的条件限制所设计出来的一个特化版本。
模板的分离编译(报错原因)
分离编译:
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链 接起来形成单一的可执行文件的过程称为分离编译模式。
比如,下面这种情况会链接报错:
![](https://img-blog.csdnimg.cn/direct/8a7786b79ce840a9aa8682b9b9c2260c.png)
![](https://img-blog.csdnimg.cn/direct/91ec18d47adf477891df405a0d935300.png)
为什么会这样呢?我们从根本上来探讨这个问题
C或者C++的程序在运行前,会有一下的步骤:
预处理:头文件展开//宏定义//条件编译//去掉注释等等
编译:检查语法,生成汇编代码(此时的汇编还是给程序员看的)
汇编:将汇编代码转为二进制机械码
链接:合并生成可执行文件(如是分离编译就是将多个obj文件合成一个,处理没有解决的地址问题)
解决方法:
1.将声名和定义放到同一个.hpp(只用来暗示是模板)文件或者.h 文件里面即可。
这样就不用在链接的时候去其他obj找地址(即不需要链接),.h被展开后在同一个源文件里,在编译时就成功实例化=>就可以匹配好地址然后调用。
2.显示实例化,但是不常用。
模板总结:
【优点】1. 模板复用了代码,节省资源,更快的迭代开发, C++ 的标准模板库 (STL) 因此而产生2. 增强了代码的灵活性【缺陷】1. 模板会导致代码膨胀问题,也会导致编译时间变长2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误(出现时建议看首行的报错)