如何在没有明确规范的情况下从dll导出模板化类?

时间:2008-12-12 13:55:59

标签: c++ dll templates

我有一个包含模板类的dll。有没有一种方法可以在没有明确规范的情况下导出它?

4 个答案:

答案 0 :(得分:17)

由于模板的代码通常位于标题中,因此您根本不需要导出函数。也就是说,使用dll的库可以实例化模板。

这是让用户可以自由地使用模板的任何类型的唯一方法,但从某种意义上说,它正在与dll的工作方式相悖。

答案 1 :(得分:5)

您是否正在考虑通过dll导出模板类的实例化?沿线的一个班级:

typedef std::vector<int> IntVec;

有一些讨论如何做到这一点: http://support.microsoft.com/kb/168958

另一种方法是通过针对此模板实例的包装类显式导出您感兴趣的每个函数。那么你不会使用比实际感兴趣的符号更多的符号来混淆dll。

答案 2 :(得分:3)

当编译器找到模板类的实例化时,例如MyTemplate&lt; int&gt;,然后它会生成模板特化的代码。
因此,所有模板代码必须放在头文件中,并包含在您想要使用的位置 如果您要“导出”模板类,只需将代码放在头文件中并将其包含在需要的位置。

答案 3 :(得分:0)

在导出控制文件中。

#ifdef XXXX_BUILD
    #define XXXX_EXPORT __declspec(dllexport)
    #define XXXX_EXTERN
#else
    #define XXXX_EXPORT __declspec(dllimport)
    #define XXXX_EXTERN extern
#endif

其中XXXX_BUILD是项目中定义的符号。

要导出您的课程。

XXXX_EXTERN template class XXXX_EXPORT YourClass<double>;

其中double是要用。实例化类的类型。

https://support.microsoft.com/en-us/help/168958/how-to-export-an-instantiation-of-a-standard-template-library-stl-clas