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

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

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++ 编译器上结果如何。


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值