2010-02-17 53 views
8

環境:Visual Studio 9,C++沒有託管擴展。DLL和完全專用的模板類

我有一個第三方庫,它導出了MyClass.h中定義的完全專用模板類MyClass<42>。它被編譯成一個輔助加載器.lib和一個.dll文件。 .lib文件包含該專業化的編譯代碼和必要的符號。 MyClass.h看起來像這樣:

template<UInt D> 
class MyClass { 
public: 
    MyClass() {...}; 
    virtual ~MyClass() {}; 
} 

現在我想使用這個庫。如果將MyClass.h包含在Client.cpp中,然後編譯它,我將在Client.obj文件中獲得這些符號的第二個副本。通過將該專業化的所有成員定義爲「extern」,我可以擺脫這些符號。我的Client.cpp看起來像這樣:

#include <ThirdParty/MyClass.h> 

extern template class MyClass<42>; 
extern template MyClass<42>::MyClass<42>(); 
extern template MyClass<42>::~MyClass<42>(); 

void MyFunction(MyClass<42>& obj) {...} 

問題是我不能擺脫這種虛擬析構函數。對於虛擬析構函數,我得到一個幾乎標準的LNK2005錯誤:

ThirdPartyd.lib(ThirdPartyd.dll) : error LNK2005: 
    "public: virtual __thiscall MyClass<42>::~MyClass<42>(void)" 
    ([email protected][email protected]@@[email protected]) already defined in Client.obj 

我該怎麼辦?

回答

4

看來,虛擬方法,有必要將其定義爲既extern__declspec(dllimport)在同一時間:

extern template __declspec(dllimport) MyClass<42>::~MyClass<42>(); 

這使我的鏈接開心就好正確鏈接我的代碼。

如果某位專家描述了爲什麼如此,或者至少指出了一些解釋這種情況的文章,我將非常高興。

1

我相信Visual Studio在某些stl結構中使用dll中的模板特化。 string想到,

我有一個快速瀏覽一下頭文件,它看起來像它的使用

__declspec(dllimport) 

上一堆專業化的聲明。儘管這對全班學生來說似乎沒有這樣做。

this discussion它聽起來像是有可能宣佈整個類作爲導出,但沒有說如何。

對不起,不完整的答案,但希望這可以幫助你探索其他場地。

+0

+1我很高興你給了這麼小的提示。 – liori 2010-02-18 11:15:05