C++中的模板,可以理解成是与类型无关的代码,只与业务逻辑有关,是代码复用的一种手段。
1.初步实现一个模板函数
定义一个模板类;
头文件:
#pragma once
class FunTemplate {
public:
FunTemplate();
~FunTemplate();
template<typename T> void deleteMem(T p);
};
CPP文件
#include "FunTemplate.h"
FunTemplate::FunTemplate() {
}
FunTemplate::~FunTemplate() {
}
template<typename T>
void FunTemplate::deleteMem(T p) {
delete p;
p = nullptr;
}
调用者:
#include "FunTemplate.h"
int main(int argc, char *argv[]){
FunTemplate* fun = new FunTemplate;
int* i = new int[10]{0};
fun->deleteMem<int*>(i);
float* f = new float[10]{0.0};
fun->deleteMem<float*>(f);
char* ch = new char[10]{0};
fun->deleteMem<char*>(ch);
}
编译:
错误 4 error LNK2019: 无法解析的外部符号 "public: void __thiscall FunTemplate::deleteMem<int *>(int *)" (??$deleteMem@PAH@FunTemplate@@QAEXPAH@Z),该符号在函数 _main 中被引用
错误 5 error LNK2019: 无法解析的外部符号 "public: void __thiscall FunTemplate::deleteMem<float *>(float *)" (??$deleteMem@PAM@FunTemplate@@QAEXPAM@Z),该符号在函数 _main 中被引用
错误 6 error LNK2019: 无法解析的外部符号 "public: void __thiscall FunTemplate::deleteMem<char *>(char *)" (??$deleteMem@PAD@FunTemplate@@QAEXPAD@Z),该符号在函数 _main 中被引用
出现连接错误:
解决办法:模板函数的声明和实现必须全部放在头文件中,而不能把它们像传统的类成员函数一样,一个放在头文件中一个放在CPP文件中。如果分开放就会出现以上的链接错误。
修改一下代码:
头文件:
#pragma once
class FunTemplate {
public:
FunTemplate();
~FunTemplate();
template<typename T> void deleteMem(T p);
};
template<typename T>
void FunTemplate::deleteMem(T p) {
delete p;
p = nullptr;
}
CPP文件:
#include "FunTemplate.h"
FunTemplate::FunTemplate() {
}
FunTemplate::~FunTemplate() {
}
修改之后再次编译一次通过。
2.传指针还是传引用
在运行过程中,在没有调用模板函数之前:
i的地址:0x00375870
运行过后:
i的地址:0x00375870
但是在调用模板函数之后,指针应该释放了呀?怎么还会存在?
解决办法:
调用模板函数是把传入的参数有指针改为引用就可以了。
继续修改代码:
头文件:
#pragma once
class FunTemplate {
public:
FunTemplate();
~FunTemplate();
template<typename T> void deleteMem(T&p);//参数传引用
};
template<typename T>
void FunTemplate::deleteMem(T&p) {
delete p;
p = nullptr;
}
再次调用运行:
i 的地址已经为空了!