C++的模板有一個較大的缺陷,模板的實現是不能放到獨立的cpp文件中的,因爲模板函數的特點,必須要類型確定時才能泛化。
例如下面的例子:
// CObject.h
template<class T>
class CObject
{
public:
CObject(T k) {obj = k;}
~CObject() {}
T getObj();
private:
T obj;
};
// CObject.cpp
#include "CObject.h"
template<class T>
T CObject<T>::getObj(){
return this->obj;
}
#include <cstdio>
#include "CObject.h"
using namespace std;
int main(){
CObject<int> Obj(10);
int k = Obj.getObj();
printf("%d\n", k);
return 0;
}
這樣分三個文件編寫,是無法通過編譯的,因爲getObj
這個函數,是模板函數,沒有對應的實例泛化是不會生成代碼的。
於是編譯時報錯,找不到getObj
解決的方法一般有,直接將模板代碼放置到.h中,或者在引用時換成:
#include "CObject.cpp"
但這樣都造成了一個問題,如果模板類在開發中,經常需要修改,那麼所有引用它的cpp都需要重複編譯,比較耗時。
爲解決這一問題,我們可以採取模板的分離編譯方式,在另外一個文件中,聲明所有需要用到的模板,這樣就可以避免其他文件中的模板函數引入。
// CObjectExpand.cpp
#include "CObject.cpp"
template class CObject<int>;