2012-06-17 187 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