0

我在这里尝试了建议。我有以下类,在实现中定义了一个模板化的成员函数,如下所示:

标头(__declspec(dllimport)在客户端应用程序中评估编译器 DLL 导入指令):

class __declspec(dllimport) A {
   ...
   template<typename T> bool func(T&) const;
}

执行:

template<typename T> bool A::func(T&) {...}

由于某些限制,我无法将其定义为标题。在独立库中,我没有得到任何构建错误。但是在使用相同编译器(x64 vs100)在相同平台上构建的客户端应用程序中,我得到的链接器错误是:

error LNK2019: unresolved external symbol bool "public: bool __cdecl A::func(...)"

感谢您对此的任何想法。谢谢!

4

2 回答 2

0

在您使用某种数据类型实际实例化它之前,不会生成您的模板代码。对于每种数据类型,编译器都会生成不同的代码。

因此,如果您想使用其他代码部分应该能够与任何数据类型一起使用的模板化代码,则需要内联提供模板实现(即在某种头文件中)。只有这样,模板才能为其他编译单元中的任何未知数据类型实例化。

如果您只需要模板的少量变体,请说 forint然后float您可以声明显式模板实例化。这些声明使编译器实际输出给定数据类型的模板代码,无论它们在编译单元中是否需要。然后,您还需要添加 dllimport/dllexport 语句(在 Windows Visual Studio 编译器的情况下)以将该代码从 DLL 中导出/导入。

在其他讨论和文档中肯定可以找到有关此的更多信息。

于 2013-09-20T22:42:23.177 回答
0

确保您的实现与类的定义位于相同的标头中(或与其他一些#include 语句一起使用)。在这种情况下,它应该可以工作。

于 2013-09-20T22:43:46.853 回答