C/C++ warning C4251: class ... 須要有 dll 接口由 class「..」 的客戶端使用

{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();
}編程

}函數

相關文章
相關標籤/搜索