动态链接库中导出模板函数

C++ 支持函数模板,利用函数模板,可以简化我们的程序代码。我在自己的代码中也经常用到函数模板,但是以前一直以为函数模板是要放到头文件中的,否则调用模板函数时,编译器会找不到函数模板的定义。今天闲暇,又翻了翻 C++ Primer,发现我以前的理解是有问题的。模板函数也可以像普通函数那样,将声明放在头文件中,定义放在.cpp 中。这时又想到另一个问题,DLL 中是否可以导出模板函数呢。如果可以的话,就可以将函数的实现代码真正隐藏起来了。经过一番实验,发现是可以的,但是有一些限制。

比如有如下的函数:

template<class TYPE> TYPE max(TYPE a, TYPE b)
{return (a > b) ? a : b;
}
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

直接写成下面的样子是不行的。

template<class TYPE> __declspec(dllexport) TYPE max(TYPE a, TYPE b)
{return (a > b) ? a : b;
}
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

因为 DLL 中想要导出一个函数,必须要生成这个函数的实体。而普通的函数模板在实例化之前是没有实体的。既然没有实例化,我们就人为的实例化它。比如下面这样:

template<class TYPE> TYPE max(TYPE a, TYPE b)
{return (a > b) ? a : b;
}template __declspec(dllexport) int max(int a, int b);
template __declspec(dllexport) char max(char a, char b);
template __declspec(dllexport) short max(short a, short b);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

再次编译,就成功的导出了三个 max 函数。

但是这里要注意,刚开始时我写成了这个样子:

template<class TYPE> TYPE max(TYPE a, TYPE b)
{return (a > b) ? a : b;
}template<int> __declspec(dllexport) int max(int a, int b);
template<char> __declspec(dllexport) char max(char a, char b);
template<short> __declspec(dllexport) short max(short a, short b);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

结果一个函数也没导出来。不知这是 VC2010 的bug 还是特意这么设计的。手里没有其他的C++ 编译器,不知其他的 C++ 编译器上结果如何。

模板函数/类不能导出到动态链接库(DLL) 
模板函数在声明的时候, 其实并不存在,函数地址也就无从谈起了,而导出到动态链接库的函数都需要有地址,也就是说——函数模板不具备导出的基本条件。  
函数模板在调用时后,有了具体的实现,这个时候才有了地址。  如果要导出,必须将参数类型列表具体化,比如说,有这么一个模板: 
template <class T1,class T2> 
void fn1(T1 testValue1,T2 testValue2) 


将参数列表具体化 
template <int,char*> __declspec(dllexport)  void fn1(int testValue1,char* testValue2)

关于通过dll导出类模板和函数模板相关推荐

  1. dll的概念、dll导出类(转)

    1. DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用. 静态链接库与动态链接库的区别: (1)静态链接库与 ...

  2. C++设计模式由浅入深(二)—— 类模板和函数模板

    二.类和函数模板 C++的模板编程特性是一个又大又复杂的话题,有许多著作专门传授这种特性和技巧.在本书中,我们会用到许多C++中的高级泛型编程特性.那么我们该如何去理解贯穿次数中的这些语言结构呢?本章 ...

  3. C++_static,类模板、函数模板、namespace

    C++_static,类模板.函数模板.namespace 1.static 2.类模板 3.函数模板 4.namespace 5.深入,更多细节 参考:侯捷<C++面向对象高级编程>

  4. 【C++ 语言】面向对象 ( 模板编程 | 函数模板 | 类模板 )

    文章目录 函数模板 类模板 代码示例 函数模板 1. 模板编程 : 类似于 Java 中的泛型编程 ; ① 函数模板 : 对应着 Java 中的泛型方法 ; ② 类模板 : 对应 Java 中的泛型类 ...

  5. C++提高部分_C++类模板与函数模板的区别---C++语言工作笔记088

    然后我们再去看看类模板和函数模板的区别, 类模板没有自动类型推导,这一种使用方式. 类模板在模板参数列表中是可以有默认参数的. 用例子去说明一下,可以看到我们写了一个Person类,然后 这个类有两个 ...

  6. C++基础:模板,函数模板和类模板

    文章目录 1. 函数模板 2. 类模板 3. 模板特化 3.1 函数模板特化 3.2 类模板特化 4. 非类型模板参数 模板是允许函数或类通过泛性的形式表现或运行的特性 1. 函数模板 模板可以使函数 ...

  7. 模板有函数模板和类模板,这个在上学期的java课里面就学了,C++应该是一样的。

    模板有函数模板和类模板,这个在上学期的java课里面就学了,C++应该是一样的. .

  8. 类模板与函数模板区别

    类模板与函数模板区别主要有两点 类模板没有自动类型推导的使用方式 类模板在模板参数列表中可以有默认参数 测试代码 #include <iostream> #include <stri ...

  9. C++模板(函数模板,类模板)的基本使用与非类型模板参数与模板的特化

    C++模板 模板初阶 泛型编程 函数模板 函数模板概念 函数模板格式 函数模板的原理 函数模板的实例化 隐式实例化 显式实例化:在函数名后的<>中指定模板参数的实际类型 模板参数的匹配原则 ...

  10. C++模板学习02(类模板)(类模板语法、类模板与函数模板的区别、类模板中的成员函数创建时机、类模板对象做函数参数、类模板与继承、类模板成员函数类外实现、类模板分文件编写、类模板与友元)

    C++引用详情(引用的基本语法,注意事项,做函数的参数以及引用的本质,常量引用) 函数高级C++(函数的默认参数,函数的占位参数,函数重载的基本语法以及注意事项) C++类和对象-封装(属性和行为作为 ...

最新文章

  1. [UWP小白日记-3]记账项目-1
  2. iptables规则的查看、添加、插入、删除和修改
  3. python 字符编码
  4. 替换ExpandableListView右边箭头Group Indicator(小图标)
  5. python赋值语句格式_Python中变量和变量赋值的几种形式
  6. 在linux下实现拓扑排序,数据结构——有向图(拓扑排序算法)
  7. xfce中的window manager
  8. 罗永浩进军乐坛,参加《谁是宝藏歌手》,网友:来祸害音乐圈了?
  9. python写一个笔记软件_科学网—python学习笔记(1)——创建应用 - 高雪峰的博文...
  10. Linux字符设备驱动中container_of宏的作用
  11. 对象释放函数kmem_cache_free核心函数slab_free的实现详解
  12. MAC地址批量生成器
  13. java string 几个字节_java中字符串占几个字节
  14. 自问自答系列——商城相关
  15. iOS开发者账号的区别
  16. 【这很AI】谷歌再推AI应用“名画匹配”:与博物馆7万幅历史名画匹配,结果可能是梵高
  17. 入职两年,我和业务撕了108次逼
  18. Android KitCat 4.4.2 ADB 官方所支持的所有Services格式翻译
  19. Failed with exception java.io.IOException....FileFormatException: Malforme... Invalid postscript.
  20. 语音控制单片机(python做的上位机控制arduino)

热门文章

  1. CSDN 首页的第一屏 广告/新闻 比率 = 40 : 2
  2. linux下openldap版本查询,用openldap进行linux认证
  3. 一行代码蒸发64亿人民币!黑客盯上区块链漏洞!Python真的变态!
  4. python螺旋圆的绘制_python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)...
  5. python中setup函数的用法_python学习之setUp函数和tearDown函数
  6. latex 分页_latex 图片跨页显示问题???
  7. Linux_ppc下软件包安装,Linux下软件包安装详解
  8. mac os 开启redis_关于Redis,学会这8点就够了
  9. mysql 攻击密码_MySQL用户Root密码为弱口令的攻击
  10. android lottie字体json,Android 动画深入Lottie