在MSVC的公共接口中创建包含模板化数据成员的结构时,您将在编译时收到警告。
一种解决方案是在DLL中导出模板化类型(请参阅this知识库文章)。
我问这个问题,因为我不知道为什么要输出这种类型?
如果不导出它,.hpp文件就有足够的信息来自行生成类型。
如果它是标准库类型,并且您有2个或更多dll,每个都可能链接到标准库的不同版本,那么您现在在代码中有多个相同类型的二进制版本。
< / LI> 醇>有什么意义?情况#1可能会在运行时崩溃,如果实际上有两个不同版本的编译器认为是相同的,但#2可能由于缺少符号而无法加载?
我完全不在这里吗?在我看来,最好的选择就是忽略来自MSVC的警告。
编辑:没有人指出这一点,但我知道并理解,如果你的模板中有静态,并且你希望在单个应用程序中的DLL的所有使用中共享这些静态:你必须,在这种情况下,导出模板实例化。对于像对象和记录器等单例的情况,这是至关重要的。答案 0 :(得分:1)
#2
即刻死亡。如果要在DLL接口中使用标准类型,必须保证使用代码是a)动态链接到相同的CRT DLL,并且b)使用相同的头编译。
#1
存在是因为您不能保证被调用代码与您相同 - 例如,专业化等。如果您自己编写该类并保证客户端和DLL看到完全相同的类,则没有任何问题。