【问题标题】:Unresolved external when exporting a templated class导出模板类时未解析的外部
【发布时间】:2012-11-12 02:57:30
【问题描述】:

我在 dll 中有这个模板智能指针类。

sp.h
---------

#ifdef VLIB_EXPORTS
#define VLIB_API __declspec(dllexport)
#else
#define VLIB_API __declspec(dllimport)
#endif


template < typename T > class VLIB_API SP
{
protected:
        T*    m_pData;
    long*       m_pRefCounter;

public:


    SP(void);
    {
        m_pData = NULL;
        m_pRefCounter = NULL;
    }

    ...
    ...
};

ImagePtr.h
---------------
class VLIB_API CVImagePtr
{
    ....
}




MainLib.h
-------------
#include sp.h
#include ImagePtr.h


typedef SP<CVBlob> CVBlobPtr;

class VLIB_API CVLib
{
public:
    virtual CVBlobPtr CreateBlob() = 0;
    virtual CVImagePtr CreateImg() = 0;
};

当我尝试在另一个项目(CVMLib)中使用这个类时,编译器会报错: 错误 LNK2019:未解析的外部符号“__declspec(dllimport) public: __thiscall SP::~SP(void)”

但 CVImagePtr 没有问题。

class VMLIB_API CVMLib : public CVLib
{
public:
    virtual  CVBlobPtr CreateBlob();
    virtual CVImagePtr CreateImg();
};

当类是模板时似乎有问题。如果是,如何导出模板类?

有人可以帮我解决这个问题吗?谢谢!

【问题讨论】:

  • SP 模板的析构函数是在sp.h 中定义的,还是有一个单独的sp.cpp 文件并在那里定义?
  • 析构函数在sp.h中定义
  • 实际上,编译器对sp.h中定义的构造函数、析构函数和复制构造函数显示错误。

标签: c++ class templates export


【解决方案1】:

正如怀疑的那样,我没有正确导出模板类。这就是我所做的:

MainLib.h

#include sp.h
#include ImagePtr.h

#ifdef VLIB_EXPORTS
#define VLIB_API __declspec(dllexport)
#define EXPIMP_TEMPLATE
#else
#define VLIB_API __declspec(dllimport)
#define EXPIMP_TEMPLATE extern
#endif

EXPIMP_TEMPLATE template class VLIB_API SP<CVBlob>;
typedef SP<CVBlob> CVBlobPtr;

class VLIB_API CVLib
{
public:
    virtual CVBlobPtr CreateBlob() = 0;
    virtual CVImagePtr CreateImg() = 0;
};

您可以在此处找到更多信息: http://support.microsoft.com/kb/168958

【讨论】:

    【解决方案2】:

    您需要使用extern "C" 标记该类,以便在该类的实现和标头上具有未损坏的名称。

    看看这个canonical answer 了解原因。

    【讨论】:

    • 那么,我将 extern "c" 包裹在哪个函数周围?
    • 围绕类的原型
    猜你喜欢
    • 2017-04-11
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    相关资源
    最近更新 更多