客户端应用程序中的C ++模板成员函数链接器错误

时间:2013-09-20 22:31:54

标签: c++ templates dllimport dllexport lnk2019

我尝试了推荐here。我有以下类,其实现中定义了模板化成员函数,如下所示:

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

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(...)"

对此有任何想法。谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

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

关于这一点的更多信息肯定可以在其他讨论和文档中找到。

答案 1 :(得分:0)

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