1. 程式人生 > >動態鏈接庫中導出模板函數

動態鏈接庫中導出模板函數

編譯器 聲明 exp post pop text turn -s pretty

動態鏈接庫中導出模板函數

C++ 支持函數模板。利用函數模板,能夠簡化我們的程序代碼。我在自己的代碼中也經經常使用到函數模板,可是曾經一直以為函數模板是要放到頭文件裏的,否則調用模板函數時,編譯器會找不到函數模板的定義。今天閑暇,又翻了翻 C++ Primer。發現我曾經的理解是有問題的。模板函數也能夠像普通函數那樣。將聲明放在頭文件裏。定義放在.cpp 中。這時又想到還有一個問題,DLL 中能否夠導出模板函數呢。

假設能夠的話,就能夠將函數的實現代碼真正隱藏起來了。經過一番實驗,發現是能夠的,可是有一些限制。

比方有例如以下的函數:

template<class TYPE
> TYPE max(TYPE a, TYPE b) { return (a > b) ? a : b; }

直接寫成以下的樣子是不行的。

template<class TYPE> __declspec(dllexport) TYPE max(TYPE a, TYPE b)
{
    return (a > b) ?

a : b; }

由於 DLL 中想要導出一個函數。必需要生成這個函數的實體。

而普通的函數模板在實例化之前是沒有實體的。既然沒有實例化,我們就人為的實例化它。比方以下這樣:

template<class TYPE> TYPE max(TYPE a, TYPE b)
{
    return
(a > b) ? a : b; } template __declspec(dllexport) int max(int a, int b); template __declspec(dllexport) char max(char a, char b); template __declspec(dllexport) short max(short a, short b);

再次編譯。就成功的導出了三個 max 函數。

可是這裏要註意,剛開始時我寫成了這個樣子:

template<class TYPE> TYPE max(TYPE a, TYPE b)
{
    return
(a > b) ? a : b; } template<int> __declspec(dllexport) int max(int a, int b); template<char> __declspec(dllexport) char max(char a, char b); template<short> __declspec(dllexport) short max(short a, short b);

結果一個函數也沒導出來。不知這是 VC2010 的bug 還是特意這麽設計的。

手裏沒有其它的C++ 編譯器,不知其它的 C++ 編譯器上結果怎樣。

動態鏈接庫中導出模板函數