标签:
因为模板是在编译的时候根据模板参数实例化的,实例化之后就像一个普通的类(函数),这样才有对应的二进制代码;否则,没有模板参数,那么编译器就不知道怎么生成代码,所以生成的DLL就没有办法导出模板了.
但是根据MSDN的描述,可以导出模板类的实例化后的代码(注意:这里不是指实例化模板类的一个对象),
比如 template<typename T> class singleton,那么可以导出singleton<MyClass>或者其他已知类型的类代码.
详见: http://support.microsoft.com/kb/168958/en-us.这个例子比较老,竟然是VC5的代码,不过我试了一下,在VC8下可以导出,不过要将exe文件中的extern声明去掉.否则不能通过.
关键语句:
#ifdef EXP_STL
# define DECLSPECIFIER __declspec(dllexport)
#else
# define DECLSPECIFIER __declspec(dllimport)
#endif
分别在EXE和DLL中使用这个声明: template class DECLSPECIFIER TEMPLATE<TYPE>;
就可以导出一个TYPE实例的TEMPLATE类代码.
MSDN上说,从一个实例化模板类集成过来的DLL导出类,就不用再声明了,好像因为在声明这个类的时候编译器已经知道了:
class DECLSPECIFIER myInterface : public singleton<myInterface>{}
class DECLSPECIFIER myInterface : public std::vector<short*>{}
这种方法直接就可以导出了,而且好像有些情况也里也不用去管C4251(http://msdn.microsoft.com/en-us/library/esew7y1w.aspx)的编译警告...
标签:
原文地址:http://www.cnblogs.com/crazii/p/4512829.html