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

更新

超人告诉我,我无法从 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>
{...};
4

1 回答 1

1

您不能导出模板。仅当实际使用该类并且此时编译器需要访问类模板的整个源时,才会创建该类的实例。C++ 标准讨论了可用于导出类模板的导出关键字,但 AFAIK 只有一个编译器实现了这一点。所以你能做的最好的就是将整个模板类定义放在一个头文件中。

于 2012-06-18T03:52:07.787 回答