{ios
在DLL編程中, 若是調用模版類, 則可能出現相似如下的錯誤:
1>xclock.h(29): warning C4251: 「XClock::m_FileName」: class「std::basic_string<char,std::char_traits<char>,std::allocator<char>>」須要有 dll 接口由 class「XClock」的客戶端使用
1>xstring(2633): note: 參見「std::basic_string<char,std::char_traits<char>,std::allocator<char>>」的聲明
1>xclock.h(30): warning C4251: 「XClock::m_Stage」: class「std::queue<std::string,std::deque<_Ty,std::allocator<_Ty>>>」須要有 dll 接口由 class「XClock」的客戶端使用
1> with
1> [
1> _Ty=std::string
1> ]
模板類在絕大多數的編譯器裏要求實現一塊兒提供,所以不能放在dll中
Solution:
第一種: 無視它或者#pragma warnind( disable: 4251 )
第二種:將該數據改成指針方式:
class __declspec( dllexport ) Test
{
public:
std::vector<int>* m_objCon;
};
而後在構造函數和析構函數中分別初始化和釋放它。
第三種:
將該模板類及其依賴類導出。
#include <iostream>
#include <vector>
using namespace std;
class __declspec( dllexport ) Test
{
public:
template class __declspec( dllexport ) std::allocator<int>;
template class __declspec( dllexport ) std::vector<int, std::allocator<int> >;
public:
std::vector<int> m_objCon;
};
int main()
{
return 0;
}
這 種方法要注意的是必需要把要導出模板類的模板數據成員一併導出。有點相似於顯式實例化。好比說你要導出boost::shared_ptr就還必須將其依 賴的shared_count一併導出。導出map還須要導出對應pair等等。很麻煩啦~因此咱們仍是選擇第四種吧。
第四種:Impl。
#include <iostream>
#include <vector>
using namespace std;
// 這些放到.h中
class Test_imp;
class __declspec( dllexport ) Test
{
// 構造函數中初始化 析構中釋放m_pImp;
void test();
public:
Test_imp* m_pImp;
};
// 這個類放到cpp中去
class Test_imp
{
public:
void test(){}
std::vector<int> m_objCon;
};
// 放到cpp中
void Test::test()
{
m_pImp->test();
}編程
}函數