模板的进阶

一.非类型模板参数

可用来定义常量。定死参数是什么类型,发生**改变的只是参数的值。**支持缺省值。

注:使用缺省值要这么干:

宏和非类型模板参数的区别

如果N是一个宏,那么它只能被定义为一个数,无法在使用时(main函数里)再做变更。而如果N是一个非类型的模板,那么就可以在使用时灵活改变大小。

坑

定死的类型仅限整型(char,int,long,bool,size_t...),double之类的都不可以,自定义类型更不可以。

二.特化

1.函数模板的特化

对函数模板某一特定类型进行具体化。其余类型正常照类模板走。

恕作者实在能力有限,特化着实用起来麻烦,各种const加的混头晕脑,还是利用特定类型实例化一个函数模板来的畅快。

函数特化要谨慎使用!!

2.类模板的特化

①.全特化

②.偏特化/半特化

③.针对指针的偏特化

④.针对引用的偏特化

特化也有惰性,能全特化绝不偏特化。

三.模板声明定义分离会出错的原因

回顾一下编译链接的过程:

解释原因

假设项目由三个文件构成:

Func.cpp,test.cpp,Func.h

两个cpp文件均包含了.h文件

test里有测试用例(实参)

函数模板声明在.h中,定义在Func.cpp中。

模板的实例化发生在编译阶段,随后进入汇编阶段时,会在符号表里生成实例化的函数的地址。最后进入链接阶段,会把上面这个地址链接上。(当然,以上是基于声明和定义在同一文件内的)

如果声明和定义分离到两个文件里,那么负责实例化的定义代码和只负责插个眼的声明代码就在不同文件中。由于test包含了.h,此时就单单一个声明代码进入编译链接的过程,那么这样是没法实例化的。既然没有实例化的定义代码,模板就没法实例化成具体的函数。那么进入汇编阶段时,没有实例化的函数,符号表就没法生成对应的函数地址。

没地址,就没法链接。

为何.cpp文件明明包含.h文件,那代码最后不是声明和定义不就会链接整合到一块了吗,那这个时候不就有实例化的代码了吗?

得注意, 即便包含了, 在最后一步链接之前,整个项目不同文件依旧是独立的。而实例化恰恰就在链接前的编译阶段。

相关推荐
朔北之忘 Clancy7 小时前
2025 CSP-J 第二轮真题解析
c++·青少年编程·题解·noip·csp·信奥赛·noi
longlongzihan7 小时前
LeetCode 17电话号码的字母组合:回溯算法(DFS)详解
c++·算法·leetcode·深度优先
yolo_guo7 小时前
调试mysql延迟与libevent回调实际发送回复时机问题
c++·mysql·libevent
今晚打老虎8 小时前
c++之提高A(前缀和)(第三课)
数据结构·c++·算法
by209999 小时前
从结构体到对象:正式学习C++类的骨架、封装与this指针
c++·经验分享·学习
2601_9622186110 小时前
C语言中三种库的编译和使用方法
开发语言·c++
jimy110 小时前
派生类重写基类虚函数(二):override的作用
开发语言·c++
ebiobiz10 小时前
基于 GD32 Embedded Builder (GEB) 与 Nimmake 的 MCU 工程搭建指南
c++·python·单片机·嵌入式硬件·mcu
hetao173383710 小时前
2026-09-29 hetao1733837 的刷题记录
c++·算法
:mnong11 小时前
几何内核“四大金刚“:ACIS、Parasolid、CGM、Open CASCADE 核心特征深度解析
c++·cad·cax