2011-07-12 13 views
3

私は、このようなテンプレートクラスがあるとしますパラメータとしてキューを使用テンプレートクラス

template <class T> 
class Queue 
{ 
public: 
    static int Size; 
}; 

template <class T> int Queue<T>::Size = 0; 

私はD.dllに関数をエクスポート:

void ChangeQueueSize(Queue<int>& q) 
{ 
    q.Size = 100; 
} 

そして私はA.EXEで、このエクスポートされた関数を使用します。キュークラスは2 projecにクラステンプレートから生成されているので

Queue<int> q; 

q.Size = 10; 

ChangeQueueSize(q); 

int updatedSize = q.Size; 

を実際には、静的データメンバーだけでなく、コードのコピーも2つあります。

ChangeQueueSizeを呼び出すと、ここでキューサイズが実際に変更されることはなく、同じクラス名を持つ別のクラスの静的メンバーが更新されます。

この問題を解決するにはどうすればよいですか?
gccの弱いシンボルはこれに対処できますか?
ありがとうございます。

答えて

4

テンプレートをライブラリに入れても、思うように配置することはできません。インスタンス化された実際のクラス定義は、ライブラリに入れることができます。

テンプレートは基本的にコード生成ツールであり、生成されたコードはライブラリにのみ置くことができます。

あなたはコンパイラがコードを生成します、とのうち、ヘッダを静的メンバの定義を取るために、明示的なテンプレートのインスタンスを使用することがあります:

// Header, shipped to clients 
template <class T> 
class Queue 
{ 
public: 
    static int Size; 
}; 

// Library source code: 
template <typename T> int Queue<T>::size = 0; 

template class Queue<int>; 

今すぐライブラリにソースファイルをコンパイルします。これには静的メンバー変数Queue<int>::sizeのインスタンスが含まれます。

消費者は、T = intで静的メンバーにアクセスできない(つまり、独自のものを提供する必要がある)ため、クラスのインスタンスはT = intでしか使用できないことに注意してください。

+0

おかげで、私はあなたの方法に「輸出」キューので、dllファイルとクライアントの共有コードとともに(のdllexport)/ declspec(dllimportのを)declspec使用することができます。 Linuxでこれをどのように実装するか考えていますか?そのような仕組みがないようです。 –

+0

Linuxでは 'declspec'は必要ありません。 Linux上で何もしない、プラットフォーム条件付きマクロにしてください。 –

+0

私はまだそれを試していなかったが、その後が、SOと実行がキューの独自のコピーを持って、あなたは本当にそれが正常に動作と思いますか? –

関連する問題