我在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:__ thishisall SP ::〜SP(void)”
但CVImagePtr没问题。
class VMLIB_API CVMLib : public CVLib
{
public:
virtual CVBlobPtr CreateBlob();
virtual CVImagePtr CreateImg();
};
当类是模板时,似乎存在问题。如果是这样,我该如何导出模板类?
有人可以帮我解决这个问题吗?谢谢!
答案 0 :(得分:0)
如所怀疑的那样,我没有正确导出模板类。这就是我所做的:
#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
答案 1 :(得分:-1)
您需要使用extern "C"
标记该类,以便在类的实现和标题上包含非损坏的名称。
请查看此canonical answer的原因。