关于模板函数/模板类编译成DLL
生活随笔
收集整理的這篇文章主要介紹了
关于模板函数/模板类编译成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) #endifC++現在這種編譯時的模板化機制,豈不是讓別個通用模板函數庫的開發商只能開源了?
總結
以上是生活随笔為你收集整理的关于模板函数/模板类编译成DLL的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: extern用法详解
- 下一篇: 当心在Lib中定义非const全局变量