使用 DLL(Visual Studio 2008 编译器)中的(专用)模板类时,出现链接器错误 - 未解析的符号。我尝试使用 Stackoverflow 中描述的“显式模板实例化”技巧,但没有奏效。我将其分解为一个非常简单的可重现示例:
我有一个动态库(DLL)'MyTemplates.lib',带有一个头文件'MyTemplates.h'(和一个源文件'MyTemplates.cpp',没有任何代码,只包含这个头文件),内容如下:
template <class T>
class A
{
public:
A()
{ int x = 7; }
};
template <class T>
class B : public A<T>
{
public:
B()
{}
};
// do explicit template instantiation for classes A<int> and B<int>
// macro 'MYTEMPLATES_API' is defined in the usual way as:
//#ifdef MYTEMPLATES_EXPORTS
// #define MYTEMPLATES_API __declspec( dllexport )
//#else
// #define MYTEMPLATES_API __declspec(dllimport)
//#endif
template class MYTEMPLATES_API A<int>;
template class MYTEMPLATES_API B<int>;
现在我有另一个动态库“UserLibary”(链接到“MyTemplates.lib”),其中包含文件“Util.h”和 Util.cpp。文件“Util.h”如下:
#include "MyTemplates.h"
class UserClass
{
public:
UserClass();
public:
A<int> bla;
B<int> blubb;
};
文件“Util.cpp”的内容是:
#include "Util.h"
UserClass::UserClass()
{
}
现在的问题是我的库“UserLibrary”编译得很好,但它给出了两个链接器错误,如下所示:
1>Util.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall B<int>::B<int>(void)" (__imp_??0?$B@H@@QAE@XZ) referenced in function "public: __thiscall UserClass::UserClass(void)" (??0UserClass@@QAE@XZ)
1>Util.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall A<int>::A<int>(void)" (__imp_??0?$A@H@@QAE@XZ) referenced in function "public: __thiscall UserClass::UserClass(void)" (??0UserClass@@QAE@XZ)
所以链接器找不到类的默认构造函数A<int>
和B<int>
. 为什么这是可能的,我怎样才能摆脱这些链接器错误?我认为类的显式模板实例化A<int>
和B<int>
(在文件'MyTemplates.h'中)可以解决这个问题,但不幸的是它似乎没有帮助 - 还是我以错误的方式使用它?我的编译器是Visual Studio 2008,操作系统是windows 7 64位,代码是64位编译的。