在dll中匯入模板類與模板函式

2021-07-05 17:48:42 字數 1513 閱讀 3661

假設我們有乙個模板類如下:

template< class t >

class carray

template< class t >

carray< t >::carray()

模板函式如下:

template

void swap(t& tnum1, t& tnum2)

#define algorithm_dll __declspec(dllimport)

#else //export

#define algorithm_dll __declspec(dllexport)

algorithm_dll void swap(t& tnum1, t& tnum2)

#define algorithm_dll __declspec(dllimport)

#else //export

#define algorithm_dll __declspec(dllexport)

algorithm_dll void swap(t& tnum1, t& tnum2)

如果在dll中包含了該模板類,要是不匯出的話,當別的dll工程使用該模版類作為成員變數時,編譯就會出現出現警告,提示該模板類及模板函式沒有匯出供客戶端程式使用。如果按通常的dll介面匯出方式匯出:

#ifndef algorithm_exports

#endif

template< class t >

class algorithm_dll carray

template< class t >

carray< t >::carray()

template

當其他程式通過dll呼叫該模版類或模板函式的時候,編譯又會報錯,提示寫在模版類宣告外面的函式不能__declspec(dllimport)。如果把模版類宣告外面的函式寫到模板類宣告裡面去實現,編譯可以通過,而在鏈結時又會出錯,提示匯出的模板類的函式是無法解析的外部符號。總之,用通常的方法都會產生問題,這是因為模板類是動態編譯的,它並不參與dll的編譯,只會在使用它的程式中才編譯,而在使用它的程式中又不允許匯入模板類。

為了解決這個問題,只能從匯出巨集的定義上動手。如果對dll該模板類(或模板函式)是__declspec(dllexport)而對其他程式既不匯出也不匯入,就可以避免上述的錯誤。因此程式可以修改為:

#ifndef algorithm_exports

#define algorithm_template

#define algorithm_template __declspec(dllexport)

#endif

template< class t >

class algorithm_template carray

template< class t >

carray< t >::carray()

template

如上所述,只要對模版類使用algorithm_template巨集而不使用algorithm_class,就可以完美的解決模板類匯出困難的問題。

函式模板與類模板(模板類)

什麼是泛型程式設計?泛型程式設計 編寫與型別無關的通用 是 復用的一種手段。模板是泛型程式設計的基礎。模板分為函式模板和類模板 下面我們就來說說函式模板 函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的型別版本 格式 template 返回值型別 函式名 引數列表 templatet1 ...

模板 函式模板與類模板

模板 template 是乙個將資料型別引數化的工具。模板分為函式模板和類模板兩種。在定義模板的時候不說明某些函式引數或者資料成員的型別,而將它們的資料型別作為模板引數。在使用模板時根據實參的資料型別確定模板引數即資料型別,從而得到模板的乙個例項。函式模板 function template 函式模...

函式模板與類模板

c 提供的函式模板可以定義乙個對任何型別變數進行操作的函式,從而大大增強了函式設計的通用性。使用函式模板的方法是先說明函式模板,然後例項化成相應的模板函式進行呼叫執行。函式模板的一般說明形式如下 template 模板形參表 返回值型別 函式名 模板函式形參表 其中,模板形參表 可以包含基本資料型別...