在动态库(dynamic libraries)和静态库(static libraries)使用模板(template)
板函数和模板类不能完全的支持动态导出库和静态库.
动态导入库和静态库: 他们实质是不一样的东西。静态库本身就包含了实际执行代码、符号表等等 ,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息
问题分析: 模板函数和模板类在库中使用的时候 非常困难,但也不是不可能,因为只有相应参数类型的模板函数在库内部有实例,就能成功导出这个模板函数。对于模板类的公有成员函数们(包括构造/析构函数)全部都必须有实例存在。
为什么要将模板实例化: 只有将导出库里面的模板函数或者模板类实例化,才能将实例化后模板函数的地址信息和模板类实例化的地址信息保存在导出库中。
示范:我还是以一个例子来说明吧,这是个动态库(dynamic libraries)的例子。
// TemplateExport.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "..\TemplateLib\TemplateLib.h"#pragma comment(lib,"TemplateLib.lib")int _tmain(int argc, _TCHAR* argv[]){fun1<int>(10);fun1<char>('x');//fun1<float>(20.f);// 连接错误fun2<float,char*>(20,"hello");//fun2<int,int>(20,30);// 连接错误CTest<char,20> test;char* ret = test.GetDataBuff();//CTest<char,30> test2;// 连接错误return 0;}范例下载地址:http://download.csdn.net/detail/xiexievv/4994974
总结与建议:不建议在导出库中使用模板相关的技术,假如你能够确定用户在使用你设计的模板函数时,将传入哪些类型(type),设计者要将这些类型的模板一 一实例化。
对模板比较感兴趣的同学还可以再看看这篇文章:
c++无类型参数模板(non-type template parameter)