2011-09-12 29 views
0

他のプロジェクトで使用できるC++でDLLを作成しようとしています。C++ DLLの作成:静的変数の初期化の問題

#ifdef MYDLL_EXPORTS 
#define MYDLL_API __declspec(dllexport) 
#else 
#define MYDLL_API __declspec(dllimport) 
#endif 

template <typename T, typename C> 
class MYDLL_API MyClass 
{ 
    private: 
     static C *variable; 

    //... 
}; 

MyClass.cpp:

#include "stdafx.h" 
#include "MyClass.h" 

template <typename T, typename C> 
C *MyClass<T, C>::variable= NULL; 

そして、私はそれをコンパイルするとき、私は「エラーLNK2001取得: 私のクラスの一つは、この

MyClass.hように見える未解決の外部シンボルを..この変数のために "。" DLLを作成しようとする前に、このコードは完全に機能しています...

この問題を解決してください。

+0

コンパイラのコマンドライン(通常は '-DMYDLL_EXPORTS')でMYDLL_EXPORTSを定義しましたか? – vanza

+0

私はより多くの文脈が必要です。 DLLをコンパイルして、同じコンパイラを使用してDLLにリンクしていますか?あなたはCコードとC++コードをインターフェースしていますか? – Michael

答えて

1

テンプレートクラスをDLLに入れることはできません。実際にはテンプレートの実際の型を指定すると、クラスの実際のコードがコンパイラによって生成されます(STLはソースコードとして出荷されます) 。

.hファイルを作成してそこにすべての実装を追加するだけです。あなたは他のプロジェクトで使用するどの種類、確実にわかっている場合は、明示的なインスタンスを使用することができます

// MyClass.h 
template <typename T, typename C> 
class MyClass 
{ 
    private: 
     static C *variable; 

    //... 
}; 

template <typename T, typename C> 
    C *MyClass<T, C>::variable= NULL; 


// OtherProject.cpp 
#include "MyClass.h" 
// ... 
MyClass<int, char> instance; //... 

、ちょうどのようなものを追加します:他のプロジェクトでは、それを含めるMyClass.cpp

// explicitly instantiate class 
template class MyClass<int, char>; 

+0

ありがとうございました! – Marshall

+0

問題はありません、楽しんでください! :) –

関連する問題