从DLL导出模板类

时间:2014-07-04 15:54:34

标签: c++ templates dll

我在从DLL导出模板化类然后在我的应用程序中导入它时遇到问题。

我的项目结构如下

  • CommonDLL,其中定义了基本模板化类(CASingleton)
  • CoreDLL,其中类(CAEngine)是从第一个DLL上的CASingleton派生的
  • 使用这两个DLL的测试可执行文件

我现在的问题是一切正常,直到我使用第一个基类(CASingleton)中定义的一些函数,这是一个模板化的类。

这些是类:

第一个DLL中的CASingleton(CommonDLL)

CASingleton.h

template<class T>
class ANIMACOMMON_API CASingleton
{
public:
    T& CreateInstance()
    {
        assert(!m_pSingletonInstance && "Trying to create for the second time a singleton.");

        m_pSingletonInstance = new T();

        return GetInstance();
    }

    void DeleteInstance()
    {
        assert(m_pSingletonInstance);
        m_pSingletonInstance = 0;
    }

    T& GetInstance()
    {
        assert(m_pSingletonInstance);
        return *m_pSingletonInstance;
    }

    T* GetInstancePtr()
    {
        assert(m_pSingletonInstance);
        return m_pSingletonInstance;
    }

private:
    static T* m_pSingletonInstance;
};

CASingleton.cpp

#include "ASingleton.h"

template<class T> T* CASingleton<T>::m_pSingletonInstance = NULL;

ANIMACOMMON_API定义如下

#ifdef ANIMACOMMON_EXPORTS
#define ANIMACOMMON_API __declspec(dllexport)
#else
#define ANIMACOMMON_API __declspec(dllimport)
#endif

然后在第二个DLL(CoreDLL)中,我将这个类派生自CASingleton

CAEngine.h

class ANIMACORE_API CAEngine : public CASingleton<CAEngine>
{
public:
    CAEngine();
    virtual ~CAEngine();

    void Test() { int i = 0; i++; }
};

CAEngine.cpp

template class CASingleton<CAnimaEngine>;

CAnimaEngine::CAnimaEngine()
{
}    

CAnimaEngine::~CAnimaEngine()
{
}

ANIMACORE_API定义如下

#ifdef ANIMACORE_EXPORTS
#define ANIMACORE_API __declspec(dllexport)
#else
#define ANIMACORE_API __declspec(dllimport)
#endif

最后一件事就是应用程序只有这样的主要功能:

int main()
{
    CAEngine engineOne;
    engineOne.Test();
    engineOne.CreateInstance();
    CAEngine engineTwo;
}

所有DLL编译都很好,但是当我尝试编译应用程序时,编译器给了我这个错误

main.obj : error LNK2019: riferimento al simbolo esterno "__declspec(dllimport) public: class CAEngine & __thiscall CASingleton<class CAEngine>::CreateInstance(void)" (__imp_?CreateInstance@?$CASingleton@VCAEngine@@@@QAEAAVCAEngine@@XZ) non risolto nella funzione _main

仅在我发表评论

时编译
engineOne.CreateInstance();

我在基类中使用的唯一函数。

有什么想法吗?

0 个答案:

没有答案