gpt4 book ai didi

c++ - DLL 和完全专用的模板类

转载 作者:可可西里 更新时间:2023-11-01 17:56:27 27 4
gpt4 key购买 nike

环境:Visual Studio 9,无托管扩展的 C++。

我有一个导出完全专用模板类的第三方库 MyClass<42>在 MyClass.h 中定义。它被编译成一个 helper loader .lib 和一个 .dll 文件。 .lib 文件包含此特化的编译代码和必要的符号。 MyClass.h 看起来像这样:

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

现在我想使用这个库。如果我在 Client.cpp 中包含 MyClass.h 然后编译它,我将在 Client.obj 文件中获得这些符号的第二个拷贝。我可以通过将该特化的所有成员定义为“外部”来摆脱这些符号。我的 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

我该怎么办?

最佳答案

对于虚方法,似乎有必要同时将它们定义为extern__declspec(dllimport):

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

这让我的链接器很高兴能够正确地链接我的代码。

如果有专家描述为什么会这样,或者至少指出一些解释这种情况的文章,我将非常高兴。

关于c++ - DLL 和完全专用的模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2284648/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com