0

このテンプレート スマート ポインター クラスは 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) で使用しようとすると、コンパイラは次のように警告します: error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall SP::~SP(void)"

CVImagePtr では問題ありません。

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

クラスがテンプレートの場合に問題があるようです。その場合、テンプレート クラスをエクスポートするにはどうすればよいですか?

誰かがこれを解決するのを手伝ってくれますか? ありがとうございました!

4

2 に答える 2

0

疑われるように、私はテンプレートクラスを適切にエクスポートしていません。これは私がしたことです:

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を参照してください。

于 2012-11-12T06:33:58.313 に答える
-1

extern "C"クラスの実装とヘッダーにマングルされていない名前を付けるには、クラスを でマークする必要があります。

理由については、この標準的な回答をご覧ください。

于 2012-11-12T03:02:03.127 に答える