C++学习 十七、类模板
前言
- 前言
- 类模板
- 定义类模板
- 模板具体化
- 隐式实例化
- 显式实例化
- 显式具体化
- 部分具体化
- 模板编译
- 模板成员
- 模板与友元
- 非模板友元
- 约束模板友元
- 非约束模板友元
本篇学习C++中的泛型编程之二,类模板。
类模板类模板与函数模板类似,用于指导编译器生成类,因此也有模板实例化和具体化。
定义类模板使用template
模板头,提示编译器是一个模板。
template
class TemplateClass{
private:
T a_;
T b_;
public:
TemplateClass(T a, T b);
T sum();
};
template
TemplateClass::TemplateClass(T a, T b){
a_ = a;
b_ = b;
}
template
T TemplateClass::sum(){
return a_ + b_;
}
类模板声明需要注意:
- 成员名不能与模板参数名相同;
- 模板参数可以有多个,
template
; - 模板可以拥有非类型参数,
template
,但非类型参数不能是浮点型; - 不同类模板或函数模板的模板参数名可以重复使用。
类模板定义需要注意:
- 在外部定义成员函数时时,需要添加模板头
template
和类限定符TemplateClass::
; - 如果在类内定义成员函数(内联),则可省略模板头和类限定符。
从类模板生成实际类的过程就是具体化,包括实例化,显式具体化和部分具体化。
隐式实例化使用模板类创建指定模板参数类型的对象,就是隐式实例化。
TemplateClass tc(2, 3);
注意:模板类隐式实例化必须显式指定模板类型,这点与函数模板不同。
显式实例化使用关键字template
指出类模板的参数类型,就是显式实例化。
template class TemplateClass;
显式具体化
如果针对某种类型的类需要不同的实现,比如int类与int*类明显实现方法不一样,则可以通过显式具体化指定特定类型的生成:
template class TemplateClass{
// ...
};
部分具体化
还可以在多模板类型参数中的指定某个参数的具体类型:
template class TTC{ // general
// ...
};
template class TTC{ // partial
// ...
};
模板编译
类模板和函数模板尽量使用包含编译,即把模板声明和定义放在同一个头文件中,需要使用模板的文件包含模板头文件。
分离编译可能导致链接错误。这是由于,分离编译时,编译器单独把每个cpp文件编译成单独的.obj文件,然后链接成.exe文件。
模板在分离编译时,由于在模板.cpp文件中没有被调用,没有生成模板实例,因此在链接时其它文件找不到类和函数实例,即报链接错误。
模板成员模板也可以作为类成员:
template class C{
public:
template
U print();
};
模板与友元
非模板友元
非模板友元是一个常规函数:
template class D{
public:
T a_;
friend void printd(D&);
};
void printd(D& d){
std::cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?