Dll無(wú)法直接導(dǎo)出
泛型
模板(generalized template),因此,如果要導(dǎo)出stl類,則模板必須先實(shí)例化(instantiated)。另外,如果導(dǎo)出的STL類使用了其他STL類,那么這些其他類必須同時(shí)被導(dǎo)出。目前stl中唯一能夠被導(dǎo)出的容器是vector,其他容器(如map、set、queue、list、deque)都因包含嵌套類而不能被導(dǎo)出。
導(dǎo)出STL類的步驟:
在Dll和exe文件中,用同樣版本的c運(yùn)行庫(kù)鏈接。譬如都用Msvcrt.lib(release)鏈接或都用Msvcrtd.lib(debug)鏈接。
Dll中,用__declspec(dllexport)導(dǎo)出模板類的實(shí)例。
在exe文件中,用__declspec(dllimport)和extern關(guān)鍵字從Dll中導(dǎo)入 stl類。
需要注意的是:當(dāng)導(dǎo)出一個(gè)以自定義類為模板參數(shù)的stl容器,必須為這個(gè)自定義類型定義<和==運(yùn)算符。譬如,如果要導(dǎo)出std::vector<CPerson>類,則必須為CPerson添加<和==運(yùn)算符。如下:
//導(dǎo)出stl類 std::vector<CPerson>
class CPerson
{
public:
int m_nAge;
char m_strName[40];
public:
bool operator < (const CPerson& c) const
{
return true;
}
bool operator == (const CPerson& c) const
{
return true;
}
};
EXPIMP_TEMPLATE template class VECDLL_API std::vector<CPerson>//顯示實(shí)例化模板類
VECDLL_API int fnVecDll(std::vector<CPerson>& vecPer); //導(dǎo)出函數(shù)
定義這兩個(gè)運(yùn)算符的原因是:所有stl容器都有“比較”成員函數(shù),這些成員函數(shù)需要調(diào)用自定義類型的<和==運(yùn)算符。通常情況下,由于沒(méi)有使用這些成員函數(shù),所以它們沒(méi)有被實(shí)例化,所以我們使用時(shí)一般就不需要為CPerson定義這兩個(gè)運(yùn)算符。然而,當(dāng)顯示實(shí)例化此容器類時(shí),它所有的成員函數(shù)都需實(shí)例化,包括它的“比較”成員函數(shù),所以這時(shí)必須實(shí)現(xiàn)CPerson的<和==運(yùn)算符。如果CPerson并不在乎<和==的意義,我們可以像上面代碼所示通過(guò)簡(jiǎn)單返回true來(lái)實(shí)現(xiàn)它們。
導(dǎo)出一個(gè)“
數(shù)據(jù)成員
包含stl對(duì)象”的類。方法與上類似。如下代碼所示:
EXPIMP_TEMPLATE template class VECDLL_API std::vector<int>//顯示實(shí)例化std::vector<int>
class VECDLL_API CContainer
{
public:
std::vector<int> m_vecNum;
};