首页 文章

我需要__declspec(dllexport)来自DLL的模板变量

提问于
浏览
0

我有一个模板类,我必须初始化一个成员变量(为null),如下所示:

template <typename T>
T * Singleton<T>::m_pInstance = NULL;

我把它放在类声明的末尾(在头文件中) . 我知道正确的位置是在cpp文件中,但类很小,只包含内联函数 .

这在头文件是解决方案一部分的常规程序中正常工作 . 但是现在我想将类添加到DLL中,并从DLL中导出它 .

我在哪里可以将__declspec(dllexport)放在这个初始化中,以便我可以从DLL中导出这个变量?

我读过的文档说正确的方法如下:

// ENGINEPART_API is defined as __declspec(dllexport)
template <typename T> ENGINEPART_API
T * Singleton<T>::m_pInstance = NULL;

DLL构建正常,但当我尝试将类导入我的程序时,我得到:

1>singleton.h(52): error C2720: 'Singleton<T>::m_pInstance' : '__declspec(dllimport)' storage-class specifier illegal on members

Update

超人告诉我,我无法从DLL导出模板 . 好吧,我可以从使用该模板的DLL导出类,这就是模板在DLL中的原因 . 我需要一种方法来初始化这个成员变量(这是静态的) .

类声明如下所示:

template <typename T> 
class ENGINEPART_API Singleton
{
private:
    static T *m_pInstance;
    // ... inline functions
};

我可以从使用该模板的DLL导出类:

class ENGINEPART_API blah : public Singleton <blah>
{...};

1 回答

  • 2

    您无法导出模板 . 只有在实际使用类时才会创建类的实例,并且此时编译器需要访问类模板的整个源 . C标准讨论了可用于导出类模板的export关键字,但AFAIK只有一个编译器可以实现这一点 . 因此,您可以做的最好的事情是将整个模板类定义放在头文件中 .

相关问题