文章目录
- 1.非类型模板参数
- 1.1 定义:
- 1.2 应用:
- 2.模板特化(特化必须原模版)
- 2.1类模板特化
- 2.2 函数模板特化
- 3模板的分离编译
- 3.1 什么是分离编译
- 3.2模板不能实现分离编译的原因(简):
- 3.3解决方法
- 实例化
- 显示实例化
- 函数的显示实例化
- 模板的显示实例化
- 函数的隐示实例化
- 类的隐示实例化
1.非类型模板参数
1.1 定义:
本质:常量;
这里不可以传变量;
** 该参数应用范围较少;多用于数组的下表访问**
这里传整形家族都可以:char或int;
1.2 应用:
array类
array的应用:
两者在物理上完全一样;
两者的区别
array可以预防越界访问;
原因:
前者是指针的解引用;
后者则是【】函数的调用;(“【】”的函数会检查是否越界)
2.模板特化(特化必须原模版)
2.1类模板特化
特化分为:全特化;偏特化;
偏特化又分为指针偏特化和部分特化和引用偏特化;
全特化:
偏特化
部分特化,指针特化
引用特化
匹配遵循最匹配原则;
2.2 函数模板特化
在函数名后加特化的类型
函数模板不建议使用模板特化:
由于函数传参数时多传const类型的导致特化较为繁琐;
解决方法:
使用函数重定义
3模板的分离编译
3.1 什么是分离编译
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链
接起来形成单一的可执行文件的过程称为分离编译模式。
3.2模板不能实现分离编译的原因(简):
由于每个.cpp文件都会进行预处理;编译;汇编;链接;
每个项目都会有两个或两个以上的文件;其中会有.h文件和cpp文件;这里的cpp文件都进行预处理;编译;汇编;链接;
这里的预处理会将.h文件进入.cpp文件。这里的cpp文件可以分为主文件和函数文件;如果这里的使用了函数模板;函数文件包含模板的声明和定义但是没有实例化;这就使这个函数没有被分配空间;也就没有函数地址;在主函数中函数调用时发现声明;这告诉编译器函数体在其他文件,要等到链接时再找;但是在链接时包含其他文件内只有模板的定义和声明
没有产生特定的一个lei或函数的地址;所以发生l链接错误
详细讲解
3.3解决方法
1.将声明和定义写在一起
2.在cpp文件内进行模板的实例化;
实例化
显示实例化
函数的显示实例化
tempate +函数定义(返回值+函数模板名+<类型>+返回值)
模板的显示实例化
tempate++类定义(class+类名+<类型>())
函数的隐示实例化
函数名+(实参)
类的隐示实例化
类名+<类型>+变量