关于通过dll导出类模板和函数模板
動(dòng)態(tài)鏈接庫中導(dǎo)出模板函數(shù)
C++ 支持函數(shù)模板,利用函數(shù)模板,可以簡化我們的程序代碼。我在自己的代碼中也經(jīng)常用到函數(shù)模板,但是以前一直以為函數(shù)模板是要放到頭文件中的,否則調(diào)用模板函數(shù)時(shí),編譯器會(huì)找不到函數(shù)模板的定義。今天閑暇,又翻了翻 C++ Primer,發(fā)現(xiàn)我以前的理解是有問題的。模板函數(shù)也可以像普通函數(shù)那樣,將聲明放在頭文件中,定義放在.cpp 中。這時(shí)又想到另一個(gè)問題,DLL 中是否可以導(dǎo)出模板函數(shù)呢。如果可以的話,就可以將函數(shù)的實(shí)現(xiàn)代碼真正隱藏起來了。經(jīng)過一番實(shí)驗(yàn),發(fā)現(xiàn)是可以的,但是有一些限制。
比如有如下的函數(shù):
template<class TYPE> TYPE max(TYPE a, TYPE b) {return (a > b) ? a : b; }- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
直接寫成下面的樣子是不行的。
template<class TYPE> __declspec(dllexport) TYPE max(TYPE a, TYPE b) {return (a > b) ? a : b; }- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
因?yàn)?DLL 中想要導(dǎo)出一個(gè)函數(shù),必須要生成這個(gè)函數(shù)的實(shí)體。而普通的函數(shù)模板在實(shí)例化之前是沒有實(shí)體的。既然沒有實(shí)例化,我們就人為的實(shí)例化它。比如下面這樣:
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);- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
再次編譯,就成功的導(dǎo)出了三個(gè) max 函數(shù)。
但是這里要注意,剛開始時(shí)我寫成了這個(gè)樣子:
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);- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
結(jié)果一個(gè)函數(shù)也沒導(dǎo)出來。不知這是 VC2010 的bug 還是特意這么設(shè)計(jì)的。手里沒有其他的C++ 編譯器,不知其他的 C++ 編譯器上結(jié)果如何。
模板函數(shù)/類不能導(dǎo)出到動(dòng)態(tài)鏈接庫(DLL)?
模板函數(shù)在聲明的時(shí)候,?其實(shí)并不存在,函數(shù)地址也就無從談起了,而導(dǎo)出到動(dòng)態(tài)鏈接庫的函數(shù)都需要有地址,也就是說——函數(shù)模板不具備導(dǎo)出的基本條件。??
函數(shù)模板在調(diào)用時(shí)后,有了具體的實(shí)現(xiàn),這個(gè)時(shí)候才有了地址。??如果要導(dǎo)出,必須將參數(shù)類型列表具體化,比如說,有這么一個(gè)模板:?
template?<class?T1,class?T2>?
void?fn1(T1?testValue1,T2?testValue2)?
{?
}?
將參數(shù)列表具體化?
template?<int,char*>?__declspec(dllexport)??void?fn1(int?testValue1,char*?testValue2)?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)
總結(jié)
以上是生活随笔為你收集整理的关于通过dll导出类模板和函数模板的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hadoop Kerberos 认证下
- 下一篇: Hbase 2.x Region in