模板(进阶)

文章目录

    • 1.非类型模板参数
      • 1.1 定义:
      • 1.2 应用:
    • 2.模板特化(特化必须原模版)
      • 2.1类模板特化
      • 2.2 函数模板特化
    • 3模板的分离编译
      • 3.1 什么是分离编译
      • 3.2模板不能实现分离编译的原因(简):
      • 3.3解决方法
        • 实例化
          • 显示实例化
            • 函数的显示实例化
            • 模板的显示实例化
            • 函数的隐示实例化
            • 类的隐示实例化

1.非类型模板参数

1.1 定义:

本质:常量;
模板(进阶)_第1张图片
这里不可以传变量
** 该参数应用范围较少;多用于数组的下表访问**
模板(进阶)_第2张图片
这里传整形家族都可以:char或int;

1.2 应用:

array类
在这里插入图片描述
array的应用:
在这里插入图片描述
两者在物理上完全一样;
两者的区别
模板(进阶)_第3张图片
array可以预防越界访问;
原因:
在这里插入图片描述
前者是指针的解引用;
后者则是【】函数的调用;(“【】”的函数会检查是否越界)

2.模板特化(特化必须原模版)

2.1类模板特化

特化分为:全特化;偏特化;
偏特化又分为指针偏特化和部分特化和引用偏特化;
全特化
模板(进阶)_第4张图片
偏特化
部分特化,指针特化
模板(进阶)_第5张图片
引用特化
模板(进阶)_第6张图片
在这里插入图片描述

匹配遵循最匹配原则

2.2 函数模板特化

函数名后加特化的类型
模板(进阶)_第7张图片
函数模板不建议使用模板特化:
模板(进阶)_第8张图片
由于函数传参数时多传const类型的导致特化较为繁琐;
解决方法:
使用函数重定义
模板(进阶)_第9张图片
模板(进阶)_第10张图片

3模板的分离编译

3.1 什么是分离编译

一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链
接起来形成单一的可执行文件的过程称为分离编译模式。

3.2模板不能实现分离编译的原因(简):

由于每个.cpp文件都会进行预处理;编译;汇编;链接;
每个项目都会有两个或两个以上的文件;其中会有.h文件和cpp文件;这里的cpp文件都进行预处理;编译;汇编;链接;
这里的预处理会将.h文件进入.cpp文件。这里的cpp文件可以分为主文件和函数文件;如果这里的使用了函数模板;函数文件包含模板的声明和定义但是没有实例化;这就使这个函数没有被分配空间;也就没有函数地址;在主函数中函数调用时发现声明;这告诉编译器函数体在其他文件,要等到链接时再找;但是在链接时包含其他文件内只有模板的定义和声明
没有产生特定的一个lei或函数的地址;所以发生l链接错误
详细讲解

3.3解决方法

1.将声明和定义写在一起
2.在cpp文件内进行模板的实例化;

实例化
显示实例化
函数的显示实例化

tempate +函数定义(返回值+函数模板名+<类型>+返回值)

模板的显示实例化

tempate++类定义(class+类名+<类型>())

函数的隐示实例化

函数名+(实参)

类的隐示实例化

类名+<类型>+变量

你可能感兴趣的:(c++,数据结构)