导出模板化类时未解析的外部

Unresolved external when exporting a templated class

本文关键字:外部      更新时间:2023-10-16

我在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();
};

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

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

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

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

您需要

extern "C"标记类,以便在类的实现和标头上具有非损坏的名称。

看看这个关于原因的规范答案。