{

在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();
}

}

C/C++ warning C4251: class ... 需要有 dll 接口由 class“..” 的客户端使用的更多相关文章

  1. (转)如何解决VC中的警告warning C4251 needs to have dll-interface

    这通常是由于以数据成员方式在DLL导出类中使用了模板类造成的.比如: #include <iostream> #include <vector> using namespace ...

  2. C++学习 | C++ Implement的使用 | 消除 warning C4251 | 精简库接口

      在编写C++动态库的过程中,我们常常会听到某个要求:请隐藏动态库头文件里类接口里的成员变量!或者自己在编写动态库时,突然意识到自己好像让调用者看到的信息太多了,而这些信息根本无需被调用者看到,往往 ...

  3. DLL接口自动化测试总结

    1. DLL接口测试方法介绍 在最近测试的项目中,系统给业务端提供DLL文件,业务端通过DLL文件中的C++接口实现系统功能,这就需要对DLL中的C++接口进行详细功能测试. 本文主要介绍项目测试中使 ...

  4. c#调用dll接口传递utf-8字串方法

    1. 起源: VCU10之视频下载模块,采用纯python编码实现,c++代码调用pythonrun.h配置python运行环境启动python模块,编译为dll给c#调用,以使界面UI能够使用其中功 ...

  5. DLL接口的实现(虚函数)

    DLL接口的实现(虚函数) 我们在c++编程过程中往往要用到各种不同形式的程序库,这些库的发布方式有动态库和静态库.对于静态类库,设计良好的静态类库能实现功能上的隔离,无法避免类库实现必须重新编译.链 ...

  6. ASP.NET使用WebApi接口实现与Android客户端的交互(图片或字符串的接收与回传)

    最近在使用WebApi   做下记录 //此接口实现接收Android客户端上传的JSON格式的信息,并返回"nihao"字符串 [Route("ReceiveData& ...

  7. Visual Studio 2010/2013 查看DLL接口(函数)

    1. “应用程序" Visual Studio 2010/2013 的Visual Studio Tools文件夹中打开Visual Studio Command Prompt 命令提示窗口 ...

  8. VS查看DLL接口

    应用程序Microsoft Visual Studio 2010的Visual Studio Tools文件夹中打开Visual Studio Command Prompt (2010)命令窗口 du ...

  9. 使用WebService发布soap接口,并实现客户端的https验证

    什么是https HTTPS其实是有两部分组成:HTTP + SSL / TLS, 也就是在HTTP上又加了一层处理加密信息的模块,并且会进行身份的验证. 如何进行身份验证? 首先我们要明白什么是对称 ...

随机推荐

  1. Oracle 环境部署 以及数据库创建 ,用户新建和权限分配

    1.右键我的电脑--->属性--->高级系统设置 2.环境变量---->新建 总共配置三个变量 (1)变量名 ORACLE_HOME 变量值 G:\app\TH\product\11 ...

  2. 笔记66 Spring Boot快速入门(六)

    SpringBoot中使用Mybatis 一.注解方式 1.创建映射文件CategoryMapper.java 使用注解@Mapper 表示这是一个Mybatis Mapper接口.使用@Select ...

  3. 57. Collections(list的工具类)、Arrays(数组的工具类)

    List集合的工具类(Collections): 注意:Collection是单列集合的根接口  Collections是操作集合对象的工具类 1.对list集合排序: sort(List) 根据自然 ...

  4. Java高并发网络编程(一)

    一.OSI网络七层模型 因特网是一个极为复杂的网络,分层有助于我们对网络的理解 .分层也是一种标准,为了使不同厂商的计算机能够互相通信,以便在更大范围内建立计算机网络,有必要建立一个国际范围的网络体系 ...

  5. JavaScript实现时间上一天和下一天切换

    JavaScript实现时间上一天和下一天切换 1.先获取时间戳毫秒数 var date = new Date()//实例化时间戳 var time = date.getTime()//获取当前毫秒数 ...

  6. Delphi 方法:overload、override、virtual、dynamic、abstract

    1.overload 在Pascal语法规则中,同一个UNIT里是不能存在两个同名的函数的,例如: function func(): Boolean; function func(const x: C ...

  7. YIi2中checkboxOptions前选框的用法

    这是checkboxOptions前选框的用法 use yii\grid\GridView; $this->registerJs(" $('#selection_all').click ...

  8. Java List T 去掉重复对象-java8

    Stream语法详解 Stream当成一个高级版本的Iterator.原始版本的Iterator,用户只能一个一个的遍历元素并对其执行某些操作:高级版本的Stream,用户只要给出需要对其包含的元素执 ...

  9. 函数的四种调用模式.上下文调用.call.apply

    闭包:函数就是一个闭包,一个封闭的作用域;         返回函数,要返回多个函数就用一个对象封装一下,         立即执行函数+return 回调函数   JS动态创建的DOM,不会被搜索引 ...

  10. yum设置代理

    echo "proxy=http://[proxy_url]:8080" >> /etc/yum.conf