2012-06-17 146 views
0

我有一个模板类中,我必须初始化一个成员变量(为null)__declspec(dllexport)的一个模板变量,像这样:我需要从一个DLL

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> 
{...}; 
+1

您没有“模板类”,而是“类模板”。这完全不同。模板不能导出,只有类可以。 –

回答

2

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

+0

嗨超人,感谢您的回复。我确实在头文件中有整个模板类定义;只有几个函数,它们是内联的。如果需要的话,我可以在这里复制。问题在于试图将类的一个(静态)成员变量初始化为null。 – fishfood