日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于通过dll导出类模板和函数模板

發(fā)布時間:2024/8/23 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于通过dll导出类模板和函数模板 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.



動態(tài)鏈接庫中導(dǎo)出模板函數(shù)

C++ 支持函數(shù)模板,利用函數(shù)模板,可以簡化我們的程序代碼。我在自己的代碼中也經(jīng)常用到函數(shù)模板,但是以前一直以為函數(shù)模板是要放到頭文件中的,否則調(diào)用模板函數(shù)時,編譯器會找不到函數(shù)模板的定義。今天閑暇,又翻了翻 C++ Primer,發(fā)現(xiàn)我以前的理解是有問題的。模板函數(shù)也可以像普通函數(shù)那樣,將聲明放在頭文件中,定義放在.cpp 中。這時又想到另一個問題,DLL 中是否可以導(dǎo)出模板函數(shù)呢。如果可以的話,就可以將函數(shù)的實現(xiàn)代碼真正隱藏起來了。經(jīng)過一番實驗,發(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

因為 DLL 中想要導(dǎo)出一個函數(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)出了三個 max 函數(shù)。

但是這里要注意,剛開始時我寫成了這個樣子:

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é)果一個函數(shù)也沒導(dǎo)出來。不知這是 VC2010 的bug 還是特意這么設(shè)計的。手里沒有其他的C++ 編譯器,不知其他的 C++ 編譯器上結(jié)果如何。


模板函數(shù)/類不能導(dǎo)出到動態(tài)鏈接庫(DLL)?
模板函數(shù)在聲明的時候,?其實并不存在,函數(shù)地址也就無從談起了,而導(dǎo)出到動態(tài)鏈接庫的函數(shù)都需要有地址,也就是說——函數(shù)模板不具備導(dǎo)出的基本條件。??
函數(shù)模板在調(diào)用時后,有了具體的實現(xiàn),這個時候才有了地址。??如果要導(dǎo)出,必須將參數(shù)類型列表具體化,比如說,有這么一個模板:?
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)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的关于通过dll导出类模板和函数模板的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。