作为一个dll新手,我必须向全能的SO询问一些事情。
假设我明确地实例化了这样的模板类:
template class __declspec(dllexport) B<int>;
如何再次使用导入此模板化课程?
我已尝试在我的.cpp文件中添加以下代码,我想使用B
template class __declspec(dllimport) B<int>;
答案 0 :(得分:5)
完全实例化模板后,您就拥有了完整的类型。它与其他任何类型都没有区别。您需要包含B
的标头以及与lib
文件的编译时链接,或者动态加载dll以链接到定义。
您是否阅读过这篇文章:http://support.microsoft.com/kb/168958?
以下是我测试(并且有效)的简要总结:
创建虚拟DLL项目
template_export_test
档案:template_export_test.h
#ifndef EXP_STL
#define EXP_STL
#endif
#ifdef EXP_STL
# define DECLSPECIFIER __declspec(dllexport)
# define EXPIMP_TEMPLATE
#else
# define DECLSPECIFIER __declspec(dllimport)
# define EXPIMP_TEMPLATE extern
#endif
EXPIMP_TEMPLATE template class DECLSPECIFIER CdllTest<int>;
档案:template_export_test.cpp
template<class T>
CdllTest<T>::CdllTest(T t)
: _t(t)
{
std::cout << _t << ": init\n";
}
创建测试应用
driver
template_export_test.lib
的路径template_export_test.lib
template_export_test.h
#include "c:\Documents and Settings\...\template_export_test.h"
using namespace std;
int main(int argc, char** argv) {
CdllTest<int> c(12);
}
答案 1 :(得分:0)
似乎即使对模板进行了明确的实例化,也可能会出现导致运行时错误的问题。 看一下this interesting article to C4251(特别是“结论”)。