【C++ 语法】模板进阶
文章目录
- 1.非类型模板参数
- 2.模板特化
- 3.模板全特化
- 4.模板偏特化
- 5.模板不能声明和定义分离
1.非类型模板参数
🍎非类型模板参数可以是 int
,long long
,string
,short
,char
;
🍌非类型模板参数必须在 编译期就能确定结果;
// N 是非类型模板参数
template<class T, int N>
class Array {public:Array(){}private:T _arr[N];
};int main()
{Array<int, 100> a1;Array<int, 1000> a2;
2.模板特化
3.模板全特化
template<class T1, class T2>
class Data {public:Data() { std::cout << "d1:原模板 Data() 的特化" << std::endl;}private:T1 _d1;T2 _d2;
};//模板全特化
template<>
class Data<int, char> {public:Data() { std::cout << "d2:模板全特化" << std::endl;}private:
};
4.模板偏特化
🍎偏特化可以特化部分参数,或者对参数的进一步限制
5.模板不能声明和定义分离
🎈 模板的特殊性:编译时生成具体代码
⚽ 模板不是真正的代码,而是「代码生成器」。例如 template<typename T> class Data
本身不会生成任何机器码,只有当用户指定具体类型(如 Data<int>
)时,编译器才会根据模板生成针对 int
类型的具体代码。
若将模板声明放在
.h
文件,定义放在.cpp
文件:当其他文件
#include .h
时,只能看到声明,看不到定义
编译器在处理这些文件时,遇到Data<int>
无法生成具体代码(缺少模板定义)
链接阶段会因找不到Data<int>
的具体实现而报错