【发布时间】:2020-10-31 20:05:36
【问题描述】:
我有一个包含模板类的 dll。有没有办法在没有明确说明的情况下导出它?
【问题讨论】:
-
“显式规范”是什么意思?没有实例化模板?
-
不用说:我定义模板的dll中的“模板类MyTemplate<int>”等。
-
你所说的“出口”是什么意思?类型库中的 C++ 关键字或导出函数?
-
导出函数。据我所知,编译器并未广泛支持“导出”。
我有一个包含模板类的 dll。有没有办法在没有明确说明的情况下导出它?
【问题讨论】:
由于模板的代码通常在标头中,因此您根本不需要导出函数。也就是说,使用 dll 的库可以实例化模板。
这是让用户自由使用模板的任何类型的唯一方法,但从某种意义上说,它与 dll 的工作方式背道而驰。
【讨论】:
您是否正在考虑通过 dll 导出模板类的实例化?一个类:
typedef std::vector<int> IntVec;
有一些讨论如何做到这一点: http://support.microsoft.com/kb/168958
另一种方法是通过针对此模板实例的包装类显式导出您感兴趣的每个函数。这样你就不会用比你实际感兴趣的符号更多的符号来弄乱 dll。
【讨论】:
当编译器找到模板类的实例化时,例如 MyTemplate<int>,它会生成模板特化的代码。
因此,所有模板代码都必须放在头文件中,并包含在您要使用的地方。
如果您想“导出”您的模板类,只需将您的代码放在头文件中并将其包含在需要的地方。
【讨论】:
在您的出口控制文件中。
#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 是您要实例化类的类型。
【讨论】: