这两天写了个Dll,要导出普通类中的模板函数,稍微查了一下,没查到具体资料。自己根据C++模板的编译原理,推断出应该要源码放在头文件中直接导出,查了下接触的Open Source项目,确实如此。这里记录一下,方便下次查阅。

1、宏定义说明:

#ifdef DLL_PROJECT
#define  TEMPLATE_IM_EXPORT __declspec(dllexport)
#else
#define TEMPLATE_IM_EXPORT
#endif
#ifdef DLL_PROJECT
#define  NORMAL_IM_EXPORT __declspec(dllexport)
#else
#define NORMAL_IM_EXPORT __declspec(dllimport)
#endif

分为普通的导入导出宏,和源码导出的情况。

2.头文件

template <typename T>   //模板类
class imexdll
{
public:T addit(T a, T b);
};
//当需要导出时,需要特例化需要导出的类型
template class TEMPLATE_IM_EXPORT imexdll<int>;  //模板函数的导出
template<typename T>  int fn1(T t1, T t2);
//需要特化导出类型
template NORMAL_IM_EXPORT int fn1(int t1, int t2);//普通函数/类的导出
NORMAL_IM_EXPORT int fn2(int a, int b);//普通类中包含模板函数的情况,模板函数机械上src…… 没查到别的方法
class NORMAL_IM_EXPORT imexdll2
{
public:template <typename T>T add(T a, T b){return a + b;}
};

3.源文件

#include "imexdll.h"template <typename T>
T imexdll<T>::addit(T a, T b)
{T c = a + b;//cout << "sum:" << c << endl;return c;
}
template <typename T> int fn1(T t1, T t2)
{return t1 + t2;
}
int fn2(int a, int b)
{return a + b;
}

4.为何不担心普通类中模板函数泄露核心代码?

对于模板函数,正常其实现功能都是调用模板type 对应下的具体功能,所以只要将具体的type 对应的实现过程封装好,核心代码是不会泄露的。

C++关于DLL导出模板类和模板函数相关推荐

  1. C++ and Java template class and function 模板类和模板函数

    在C++和Java的泛式编程中,模板template的使用是必不可少的,但是Java中没有template关键字,所以两者的写法还是有些许区别的,请参见如下代码: Java的模板 // Java pu ...

  2. 【C++】模板类的友元函数

    模板类友元函数 模板类的友元函数 参考:https://blog.csdn.net/dreamer_lhs/article/details/53580088 区分:友元是否为函数模板 非模板友元 约束 ...

  3. 【c++】模板类继承模板类

    C++继承访问权限:https://www.runoob.com/cplusplus/cpp-inheritance.html 1. 普通类继承 demo #include <iostream& ...

  4. 模板类可以使用虚函数,模板函数不能是虚函数

    1.普通的类中怎么使用虚函数,模板类中也可以这么使用虚函数 不过需要注意的是使用模板类定义不同的类型则是两个完全不同的类. 2.模板函数不能是虚函数 编译器期望在处理类定义的时候就能确定虚函数表的大小 ...

  5. C++代码片段(四)萃取模板类的模板参数类型

    例如有类型 Test<int, double, std::string> 可以萃取出模板参数分别是 int, double, std::string 方法如下 #include <t ...

  6. C++模板类的虚函数成员

    C++模板类只有在被使用的时候才会被特化,同样其成员函数也是在被使用的时候才被实例化.但是虚函数成员例外,原因应该是在定义一个模板类类型的变量时(使用模板类),为了确定虚函数表的大小,就已经实例化了虚 ...

  7. 学习笔记-----C++模板类中友元函数重载输出运算符时提示无法解析的外部符号解决方案

    今天在写单向链表实现线性表的时候打算重载输出运算符用来将线性表输出,结果无奈又遇到了问题. 大致代码如下 <pre name="code" class="cpp&q ...

  8. 8.DLL导出C++类

    DLL中不仅可以导出函数和变量,也可以导出C++类.只需要在导出类名前关键字class后加上_declspec(dllexport),就可以实现导出类 1.DLL简单导出类代码 class _decl ...

  9. QList模板类常用接口函数

    插入操作:insert() 函数原型:void QList::insert(int i, const T &value) 在索引后插入值 i:索引 value:插入值 Example: QLi ...

最新文章

  1. 多个文件中的数据处理,输出自己想要是数据
  2. 如何利用图像预处理提高OCR的准确性?
  3. leetcode算法题--左旋转字符串
  4. 关于PIC和FPGA
  5. “五心”知“五感”,平安打造有温度的智慧城市
  6. P3449-[POI2006]PAL-Palindromes【结论题,字符串hash】
  7. WebApi权限验证流程的设计和实现
  8. HTML5 API详解(11):Cache 应用程序缓存,这下离线也可以玩了
  9. (一)人工智能与机器语言翻译简介
  10. [转载]你呀,最大的问题就是太合群了
  11. Ubuntu开发问题集
  12. linux之sed使用
  13. java script幻灯片效果,JS实现图片幻灯片效果代码实例
  14. python词频统计三国演义_python实例:三国演义TXT文本词频分析
  15. 待嫁闺中:PPTV的辛酸史
  16. 周末C语言基础学习小结
  17. 096: 复习习题 求导题型 Case4:变积分限函数导数;Case5:高阶导数;Case6:分段函数求导
  18. 小胖子学spring-aop
  19. 洛谷3387 模板 缩点
  20. ORA-16401: archivelog rejected by RFS

热门文章

  1. 【LeetCode】宝石与石头
  2. 内存映射方法CreateFileMapping、MapViewOfFile、UnmapViewOfFile
  3. 如何禁止别人使用U盘的方法 - 并不需要使用专业软件
  4. matlab cum4est,MATLAB高阶累积量工具箱
  5. 一次SQL优化的体验
  6. matlab函数grid,matlab中griddata函数怎么用
  7. 关于Risc指令采取流水线技术后时钟周期的变化
  8. 中国CAE行业现状及发展前景分析
  9. 整理✨decimal类型
  10. 在React-native中使用SVG详细过程