C++ 在MSVC中导出模板真的有用吗?

C++ 在MSVC中导出模板真的有用吗?,c++,visual-studio,visual-c++,stl,C++,Visual Studio,Visual C++,Stl,当您在MSVC的公共接口中创建包含模板数据成员的结构时,您将在编译时收到警告 一种解决方案是导出DLL中的模板类型(参见KB文章) 我问这个问题是因为我不知道你为什么要导出这个类型 如果不导出它,.hpp文件有足够的信息自行生成该类型 如果它是标准库类型,并且您有2个或多个dll,每个dll都可能链接到标准库的不同版本,那么您的代码中现在有多个相同类型的二进制版本 重点是什么?如果编译器认为实际上有两个不同的版本是相同的,那么案例#1可能会在运行时导致崩溃,但是#2可能因为缺少符号而无法加载 我

当您在MSVC的公共接口中创建包含模板数据成员的结构时,您将在编译时收到警告

一种解决方案是导出DLL中的模板类型(参见KB文章)

我问这个问题是因为我不知道你为什么要导出这个类型

  • 如果不导出它,.hpp文件有足够的信息自行生成该类型

  • 如果它是标准库类型,并且您有2个或多个dll,每个dll都可能链接到标准库的不同版本,那么您的代码中现在有多个相同类型的二进制版本

  • 重点是什么?如果编译器认为实际上有两个不同的版本是相同的,那么案例#1可能会在运行时导致崩溃,但是#2可能因为缺少符号而无法加载

    我在这里完全偏离了底线吗?在我看来,最好的选择是忽略MSVC的警告

    编辑:还没有人指出这一点,但我知道并理解,如果您的模板中有静态,并且您希望在单个应用程序中的DLL的所有使用中共享这些静态:在这种情况下,您必须导出模板实例化。对于类似于单例对象和记录器之类的对象来说,这是至关重要的。

    #2
    是瞬间死亡。如果要在DLL接口中使用标准类型,必须保证使用的代码a)动态链接到相同的CRT DLL,b)使用相同的头编译


    #1
    的存在是因为您无法保证被调用的代码与您的代码相同,例如,专门化等。如果您自己编写类并保证客户端和DLL看到的是完全相同的类,那么这并没有什么问题。

    我们在这里禁用了该警告,并且从未遇到问题。可能只是运气不好。最终,禁用警告也是我们的路线。那么这是否意味着你同意我的评估,即禁用警告是唯一真正的答案?要么你有相同的版本,一切正常,要么你没有相同的版本,要么你1)崩溃,要么2)无法互操作?@lefticus:警告一般不应该被禁用-它们很重要。您应该逐个类型地禁用它们,也就是说,只有您知道的类型是在共享头中完整定义的。我想我应该澄清一下,我指的是标准库类型。那些没有在标题中完全实现,并且您无法真正控制的内容。然而,这个问题几乎没有意义,因为我链接到的知识库文章明确指出,唯一可以导出的类型是std::vector。@lefticus:在这种情况下,您应该保持警告不变,因为他们准确地警告您,您正在做一些非常错误的事情-除非您规定了我在
    #2
    中提到的条件。