C++ template 分離式編譯

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>;

示例代碼:https://github.com/sunxfancy/TemplateTest

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章