動態鏈接庫中導出模板函數
阿新 • • 發佈:2017-07-26
編譯器 聲明 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++ 編譯器上結果怎樣。
動態鏈接庫中導出模板函數