[visual-studio]DLL 和完全专业的模板类

标签: Visual-Studio dll
发布时间: 2014/2/28 19:38:44
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

环境: Visual Studio 9,c + + 托管扩展没有。

我有一个第三方库,出口完全专业的模板类 MyClass<42> 在 MyClass.h 中定义。它获取编译成佣工装载机.lib 和.dll 文件。.Lib 文件包含已编译的代码,此专业化、 和必要的符号。MyClass.h 看起来像这样:

template<UInt D>
class MyClass {
public:
    MyClass() {...};
    virtual ~MyClass() {};
}

现在我想使用此库。如果我在 Client.cpp 中包括 MyClass.h,然后编译它,我会在 Client.obj 文件中的这些符号的第二个副本。我可以摆脱这些符号的定义,专业化的所有成员,为"extern"。我 Client.cpp 看起来像这样:

#include <ThirdParty/MyClass.h>

extern template class MyClass<42>;
extern template MyClass<42>::MyClass<42>();
extern template MyClass<42>::~MyClass<42>();

void MyFunction(MyClass<42>& obj) {...}

问题是我不能摆脱虚拟析构函数的这种方式。为虚拟析构函数出现几乎成为标准的 LNK2005 错误:

ThirdPartyd.lib(ThirdPartyd.dll) : error LNK2005:
    "public: virtual __thiscall MyClass<42>::~MyClass<42>(void)"
    (??1?$MyClass@$01@@@UAE@XZ) already defined in Client.obj

我该怎么办?

解决方法 1:

看来虚拟方法有必要将它们定义为两个 extern__declspec(dllimport) 在同一时间:

extern template __declspec(dllimport) MyClass<42>::~MyClass<42>();

这使我高兴正确链接我的代码的链接器。

我会很高兴为什么描述一些专家如果是这样的话,或至少指出,一些本文解释这种情况。

赞助商