关于通过dll导出类模板和函数模板
动态链接库中导出模板函数
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导出类模板和函数模板相关推荐
- dll的概念、dll导出类(转)
1. DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用. 静态链接库与动态链接库的区别: (1)静态链接库与 ...
- C++设计模式由浅入深(二)—— 类模板和函数模板
二.类和函数模板 C++的模板编程特性是一个又大又复杂的话题,有许多著作专门传授这种特性和技巧.在本书中,我们会用到许多C++中的高级泛型编程特性.那么我们该如何去理解贯穿次数中的这些语言结构呢?本章 ...
- C++_static,类模板、函数模板、namespace
C++_static,类模板.函数模板.namespace 1.static 2.类模板 3.函数模板 4.namespace 5.深入,更多细节 参考:侯捷<C++面向对象高级编程>
- 【C++ 语言】面向对象 ( 模板编程 | 函数模板 | 类模板 )
文章目录 函数模板 类模板 代码示例 函数模板 1. 模板编程 : 类似于 Java 中的泛型编程 ; ① 函数模板 : 对应着 Java 中的泛型方法 ; ② 类模板 : 对应 Java 中的泛型类 ...
- C++提高部分_C++类模板与函数模板的区别---C++语言工作笔记088
然后我们再去看看类模板和函数模板的区别, 类模板没有自动类型推导,这一种使用方式. 类模板在模板参数列表中是可以有默认参数的. 用例子去说明一下,可以看到我们写了一个Person类,然后 这个类有两个 ...
- C++基础:模板,函数模板和类模板
文章目录 1. 函数模板 2. 类模板 3. 模板特化 3.1 函数模板特化 3.2 类模板特化 4. 非类型模板参数 模板是允许函数或类通过泛性的形式表现或运行的特性 1. 函数模板 模板可以使函数 ...
- 模板有函数模板和类模板,这个在上学期的java课里面就学了,C++应该是一样的。
模板有函数模板和类模板,这个在上学期的java课里面就学了,C++应该是一样的. .
- 类模板与函数模板区别
类模板与函数模板区别主要有两点 类模板没有自动类型推导的使用方式 类模板在模板参数列表中可以有默认参数 测试代码 #include <iostream> #include <stri ...
- C++模板(函数模板,类模板)的基本使用与非类型模板参数与模板的特化
C++模板 模板初阶 泛型编程 函数模板 函数模板概念 函数模板格式 函数模板的原理 函数模板的实例化 隐式实例化 显式实例化:在函数名后的<>中指定模板参数的实际类型 模板参数的匹配原则 ...
- C++模板学习02(类模板)(类模板语法、类模板与函数模板的区别、类模板中的成员函数创建时机、类模板对象做函数参数、类模板与继承、类模板成员函数类外实现、类模板分文件编写、类模板与友元)
C++引用详情(引用的基本语法,注意事项,做函数的参数以及引用的本质,常量引用) 函数高级C++(函数的默认参数,函数的占位参数,函数重载的基本语法以及注意事项) C++类和对象-封装(属性和行为作为 ...
最新文章
- [UWP小白日记-3]记账项目-1
- iptables规则的查看、添加、插入、删除和修改
- python 字符编码
- 替换ExpandableListView右边箭头Group Indicator(小图标)
- python赋值语句格式_Python中变量和变量赋值的几种形式
- 在linux下实现拓扑排序,数据结构——有向图(拓扑排序算法)
- xfce中的window manager
- 罗永浩进军乐坛,参加《谁是宝藏歌手》,网友:来祸害音乐圈了?
- python写一个笔记软件_科学网—python学习笔记(1)——创建应用 - 高雪峰的博文...
- Linux字符设备驱动中container_of宏的作用
- 对象释放函数kmem_cache_free核心函数slab_free的实现详解
- MAC地址批量生成器
- java string 几个字节_java中字符串占几个字节
- 自问自答系列——商城相关
- iOS开发者账号的区别
- 【这很AI】谷歌再推AI应用“名画匹配”:与博物馆7万幅历史名画匹配,结果可能是梵高
- 入职两年,我和业务撕了108次逼
- Android KitCat 4.4.2 ADB 官方所支持的所有Services格式翻译
- Failed with exception java.io.IOException....FileFormatException: Malforme... Invalid postscript.
- 语音控制单片机(python做的上位机控制arduino)
热门文章
- CSDN 首页的第一屏 广告/新闻 比率 = 40 : 2
- linux下openldap版本查询,用openldap进行linux认证
- 一行代码蒸发64亿人民币!黑客盯上区块链漏洞!Python真的变态!
- python螺旋圆的绘制_python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)...
- python中setup函数的用法_python学习之setUp函数和tearDown函数
- latex 分页_latex 图片跨页显示问题???
- Linux_ppc下软件包安装,Linux下软件包安装详解
- mac os 开启redis_关于Redis,学会这8点就够了
- mysql 攻击密码_MySQL用户Root密码为弱口令的攻击
- android lottie字体json,Android 动画深入Lottie