次のようにメンバー変数を (null に) 初期化する必要があるテンプレート クラスがあります。
template <typename T>
T * Singleton<T>::m_pInstance = NULL;
これをクラス宣言の最後 (ヘッダー ファイル内) に置きます。これの正しい場所は cpp ファイルにあると思いますが、クラスは小さく、インライン関数しか含まれていません。
これは、ヘッダー ファイルがソリューションの一部である通常のプログラムでは正しく機能します。しかし、クラスを DLL に追加し、DLL からエクスポートしたいと考えています。
この変数を DLL からエクスポートできるように、この初期化で __declspec(dllexport) をどこに置くことができますか?
私が読んだドキュメントによると、正しい方法は次のとおりです。
// 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
アップデート
Superman は、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>
{...};