Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;类扩展模板类的符号导出 我正在使用VisualStudio 2008构建C++项目。 我正在定义(在生成dll的项目中)一个模板类和一个派生类,而不是模板类: template <class T> struct DLL_EXPORT Base { int base() { return 1; } }; struct DLL_EXPORT Deriv: public Base<Deriv> { int deriv() { return 1; } };_C++_Templates_Visual C++_Linker - Fatal编程技术网

C++;类扩展模板类的符号导出 我正在使用VisualStudio 2008构建C++项目。 我正在定义(在生成dll的项目中)一个模板类和一个派生类,而不是模板类: template <class T> struct DLL_EXPORT Base { int base() { return 1; } }; struct DLL_EXPORT Deriv: public Base<Deriv> { int deriv() { return 1; } };

C++;类扩展模板类的符号导出 我正在使用VisualStudio 2008构建C++项目。 我正在定义(在生成dll的项目中)一个模板类和一个派生类,而不是模板类: template <class T> struct DLL_EXPORT Base { int base() { return 1; } }; struct DLL_EXPORT Deriv: public Base<Deriv> { int deriv() { return 1; } };,c++,templates,visual-c++,linker,C++,Templates,Visual C++,Linker,现在,当我试图在另一个项目中使用我的Deriv类时,麻烦开始了。如果我只使用Deriv中的函数,它工作得很好: Deriv d; d.deriv(); 但是如果我尝试调用d.base(),我会得到以下链接器错误: error LNK2019: unresolved external symbol "__declspec(dllimport) public: int __thiscall Base<struct Deriv>::base(void)" (__imp_?base@?$B

现在,当我试图在另一个项目中使用我的
Deriv
类时,麻烦开始了。如果我只使用
Deriv
中的函数,它工作得很好:

Deriv d;
d.deriv();
但是如果我尝试调用
d.base()
,我会得到以下链接器错误:

error LNK2019: unresolved external symbol "__declspec(dllimport) public: int __thiscall Base<struct Deriv>::base(void)" (__imp_?base@?$Base@UDeriv@@@@QAEHXZ)
错误LNK2019:未解析的外部符号“\uu declspec(dllimport)public:int\uu thiscall Base::Base(void)”(\uu imp\uu?Base@$Base@UDeriv@@@@QAEHXZ)
如果在我的dll代码的其他地方,我使用的是d.base()函数,那么它工作正常,链接器错误在“user”项目中消失。如果我删除了模板部分(在我的示例中它不是很有用,但在现实生活中它是有用的),那么一切都很好

如果没有使用该函数,或者类似的东西,它看起来就不会被编译。有什么想法吗


提前感谢。

如果这是您的问题,您可以通过以下方式解决

在DLL中的一个.cc文件(不是头文件)中,包含模板定义并写入:

template int Base<Deriv>::base();
template int Base::Base();

这将迫使编译器将
Base::Base()
的代码放入该编译单元,以便链接器可以找到它。

对此我不太了解,但我认为您可以通过编写

template struct Base<Derive>;
模板结构库;
在源文件的某个地方。(或者可能
模板DLL\u导出结构基;

不要在模板定义上使用u declspec(dllexport),因为它们没有导出(在实例化之前它们不是真正的代码)。
它们仅在头文件中供源使用。您可以在模板的专门化上使用uu declspec(dllexport),但必须在DLL中至少安装一次。

我不确定,但我认为这不会导出名称Base::Base()@Edwin:我很想知道。该类被声明为“dllexport”,因此编译器可能会在此处执行正确的操作。您是100%正确的。把你的建议放在一个dll源中,然后链接OK。(没想到)这一个可行,但由于我的基类中有几个方法,karadoc的答案更有效:您可以在onceThanks显式实例化整个类以进行注释,即使它不能解决问题,我没有想到。对于来到这里的可怜的灵魂:如果使用MinGW,这个答案可能会解决你的问题。无论您在子类/DLL中执行什么操作,如果基本模板类具有
\uuuu declspec(dllexport)
,都会出现链接时间错误。是的,这很有效!谢谢不需要DLL_导出,您甚至可以说
模板库
(不带struct关键字)
template struct Base<Derive>;