0

次のようにメンバー変数を (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>
{...};
4

1 に答える 1

1

テンプレートをエクスポートすることはできません。クラスのインスタンスは、クラスが実際に使用されるときにのみ作成され、その時点で、コンパイラはクラス テンプレートのソース全体にアクセスする必要があります。C++ 標準では、クラス テンプレートのエクスポートに使用できる export キーワードについて説明していますが、これを実装するコンパイラは 1 つだけです。そのため、テンプレート クラスの定義全体をヘッダー ファイルに含めることをお勧めします。

于 2012-06-18T03:52:07.787 に答える