C++ 如何在没有显式规范的情况下从dll导出模板类?

C++ 如何在没有显式规范的情况下从dll导出模板类?,c++,dll,templates,C++,Dll,Templates,我有一个包含模板类的dll。有没有一种方法可以在没有明确规范的情况下导出它?因为模板的代码通常在标题中,所以根本不需要导出函数。也就是说,使用dll的库可以实例化模板 这是允许用户自由使用模板中的任何类型的唯一方法,但从某种意义上说,这与DLL的工作方式相反。当编译器找到模板类的实例化(如MyTemplate)时,它会生成模板专用化的代码。 因此,所有模板代码必须放在头文件中,并包含在您想要使用它的地方。 如果您想“导出”模板类,只需将代码放在头文件中,并将其包含在需要的位置。您是否正在考虑通过

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

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


这是允许用户自由使用模板中的任何类型的唯一方法,但从某种意义上说,这与DLL的工作方式相反。

当编译器找到模板类的实例化(如MyTemplate)时,它会生成模板专用化的代码。
因此,所有模板代码必须放在头文件中,并包含在您想要使用它的地方。

如果您想“导出”模板类,只需将代码放在头文件中,并将其包含在需要的位置。

您是否正在考虑通过dll导出模板类的实例化?一个大致如下的类:

typedef std::vector<int> IntVec;
typedef std::vector IntVec;
关于如何做到这一点,有一些讨论:


另一种方法是通过针对该模板实例的包装器类显式导出您感兴趣的每个函数。这样,您就不会在dll中使用比您实际感兴趣的符号更多的符号。

在导出控制文件中

#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>;
XXXX\u外部模板类XXXX\u导出类;
其中,double是要实例化类的类型


你说的“明确规范”是什么意思?没有实例化模板?没有在我定义模板的dll中说:“模板类MyTemplate”之类的话。那么“导出”是什么意思?C++关键字或导出类型库中的函数?导出函数。据我所知,“导出”在编译器中并没有得到广泛的支持。这里有一些关于如何导出模板类的文档:除了支持这种功能的vs6之外。这就是为什么从VS6到VS10的转换会导致错误,因为C++的变化,这已经不再是最新的了。11@Ident你能详细解释一下吗?@camino已经有一段时间了,所以我不确定我在这里指的是什么,但根据你的说法,你可以为显式实例化声明执行“extern template class | struct”。现在,如果不导出函数,该如何工作呢?链接不好。我在“HOWTO:在类内部和外部导出STL组件”的标题下找到了这篇文章。