繁体   English   中英

DLL和完全专业的模板类

[英]DLL and fully-specialized template class

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

我有一个第三方库,该库可以导出在MyClass.h中定义的完全专业的模板类MyClass<42> 它被编译为帮助加载程序.lib和.dll文件。 .lib文件包含此专业的编译代码和必要的符号。 MyClass.h看起来像这样:

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

现在,我想使用这个库。 如果我将MyClass.h包含在Client.cpp中,然后对其进行编译,则将在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>();

这使我的链接器很高兴可以正确地链接我的代码。

如果某些专家描述了原因,或者至少指向一些解释这种情况的文章,我将感到非常高兴。

我相信Visual Studio对某些stl构造在dll中使用模板专业化。 string浮现在脑海,

我快速浏览了头文件,看起来好像正在使用

__declspec(dllimport)

一堆专业的宣言。 不过,似乎整个班级都没有这样做。

通过此讨论 ,听起来可以将整个类声明为已导出,但没有说明如何。

很抱歉,答案还不太完整,但是希望可以帮助您探索其他场所。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM