1. 包含式:
声明和定义都放在*.h文件,调用者直接调用此*.h。
缺点:代码暴露,编译时间长。
2. 分离式
声明和定义分离,但是在*.CPP定义构造和析构函数时要注意,在函数体里是否要添加<T>,不同编译器不一样
这种分离式可写成DLL形式,*.h类声明前注明 ..EXPORT...就行。在主程序可调用(同样需要包含.CPP)
(1)不包含,MINGW, VS都能编译
template<class T>
CMax<T>::CMax()
{
}
(2)包含,VS支持,MINGW不行
template<class T>
CMax<T>::CMax<T>()
{
}
这种方式调用,需要调用者包含*.cpp
3. 改进显示实例化
对第二种方式,很明显要向用户暴露*.CPP代码,形式上感觉分离了,但实际上没什么卵用。这时候最好
给出一个中间接口来进行封装。这样不能暴露代码,且能节省编译时间。举例说明
// ----- alg.h --------------------------------------------------
#pragma once
template<class T>
class alg
{
T add(T a, T b);
}
// ----- alg.cpp --------------------------------------------
#pragma once
#include “alg.h”
template<class T>
T alg<T>::add(T a, T b)
{
return a + b;
}
// ----- alg_instance.h--------------------------------------------
template class alg<int>;
template class alg<double;
//---------------- main.cpp --------------
#include "alg_instance.h"
main()
{
alg<int> ai;
int sum = ai.add(3, 5)
}