从dll导入显式实例化的模板类

时间:2009-03-20 15:27:29

标签: c++ dll templates

作为一个dll新手,我必须向全能的SO询问一些事情。

假设我明确地实例化了这样的模板类:

template class __declspec(dllexport) B<int>;

如何再次使用导入此模板化课程?

我已尝试在我的.cpp文件中添加以下代码,我想使用B

template class __declspec(dllimport) B<int>;

2 个答案:

答案 0 :(得分:5)

完全实例化模板后,您就拥有了完整的类型。它与其他任何类型都没有区别。您需要包含B的标头以及与lib文件的编译时链接,或者动态加载dll以链接到定义。

您是否阅读过这篇文章:http://support.microsoft.com/kb/168958

以下是我测试(并且有效)的简要总结:


创建虚拟DLL项目

  • 使用Win32控制台应用程序向导生成名为template_export_test
  • 的dll头/源文件
  • 添加了以下内容:

档案: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
  • 的Win32控制台应用程序
  • 编辑此项目的链接器项目设置:
    • 添加到链接器&gt;一般&gt;其他图书馆目录:template_export_test.lib的路径
    • 添加到链接器&gt;输入&gt;附加依赖项:template_export_test.lib
  • 在主要cpp文件中包含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(特别是“结论”)。