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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于模板函数/模板类编译成DLL

發布時間:2024/4/11 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于模板函数/模板类编译成DLL 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

]關于模板函數/模板類編譯成DLL

Posted on 2011-08-16 08:48 單魚游弋 閱讀( 353) 評論( 0) 編輯 收藏

要編譯成DLL,就要聲明和實現分開。

首先文件組織是這樣的(為了簡化,沒有加上編譯成DLL的語句) 在 T.h 中(聲明模板函數) template<typename T> T Max(T& t1,T& t2); 在 T.cpp 中(模板函數的實現) #include"T.h" template<typename T> T Max(T& t1,T& t2) { ? return t1>t2?t1:t2; } 編譯 T.cpp 很好,通過編譯 在 Main.cpp 中(用于測試的) #include<iostream> using namespace std; #include"T.h" int main() { ? int a=3,b=4; cout<<Max(a,b)<<endl; ? double c=5.6,d=4.8; cout<<Max(c,d)<<endl; system("pause"); ? return 0; }? 編譯 Main.cpp 很好,也通過編譯 然后 鏈接運行程序 此時,產生鏈接錯誤了(Visual Studio 2008環境下) 1>Main.obj : error LNK2019: 無法解析的外部符號 "double __cdecl Max<double>(double &,double &)" (??$Max@N@@YANAAN0@Z),該符號在函數 _main 中被引用 1>Main.obj : error LNK2019: 無法解析的外部符號 "int __cdecl Max<int>(int &,int &)" (??$Max@H@@YAHAAH0@Z),該符號在函數 _main 中被引用 鏈接器根本沒有找到那兩個函數 發現模板的東西分開成 .h 和 .cpp 是不行的 因為模板是需要在編譯時實現特例化的,光編譯T.cpp是沒有產生可用的函數的。 因此,模板函數/模板類也無法編譯成DLL Visual Studio 中的系統庫中的STL(標準模板庫)都是以源代碼的形式呈現的(例如<map>里面可以看到源碼的) 看來微軟也沒得好辦法解決這個 所以一般而言 模板的東西 還是都直接寫到 .h 就好了 至于說一定要分開成 .h 和 .cpp的話,用的時候需要#include".cpp"(這個方法很畸形,本質還是直接include了聲明和實現,據說gcc可以分開成 .h 和 .cpp,沒有測試過,應該只是編譯器自動化的幫你include了) 當然這樣還是不能編譯成DLL的,我查閱了一下,實在想編譯成DLL的話,必須在編譯模板的時候就進行特例化(其實這樣失去了模板的優勢了,唯一好點的就是可以特例化多種形式) 在 原來的 T.cpp 中加上這段就可以特例化了(也可以加到 T.h 中) template int Max<int>(int& ,int& ); //int特例化 template double Max<double>(double& ,double& ); //double特例化 這樣編譯鏈接運行,就可以了 要編譯成DLL的話,加上DLL的那個關鍵字就可以了 #ifdef DLL_EXPORTS #define DLLT_API __declspec(dllexport) #else #define DLL_API __declspec(dllimport) #endif
C++現在這種編譯時的模板化機制,豈不是讓別個通用模板函數庫的開發商只能開源了?

總結

以上是生活随笔為你收集整理的关于模板函数/模板类编译成DLL的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。