私が見つけた限りでは、クラステンプレート内の静的変数を初期化するための記事がありました。しかし、私はメンバ関数テンプレートで通常のクラスを使用しているので、私は尋ねなければなりません。ショートバージョンでテンプレート関数でクラス内の静的メンバ変数を初期化する方法
(全体ではないクラス定義)私はこのようになりクラスがあります。
class BatchManager
{
private:
static std::vector<BaseBatch_P> _BATCHES;
public:
template <class T>
static void placeData(T* data){
//Loop through the entire container
for (auto&& b: _BATCHES)
if (b==data){
dynamic_cast<Batch<T>>(b)->draw(data);
}
//If no bach found, create a new One
createNewBatch(data);
}
};
を私は関数内のメンバ変数にアクセスしたい場合しかし、それは示しています 未定義クラスヘッダーに定義を保持:
BatchManagerを参照:: _ BATCHES次にI'veは、以下を試し
そしてCPPファイル:
std::map<GLuint,BaseBatch_P> BatchManager::_TEXTURE_MAP;
template <typename T>
void BatchManager::placeData(T* data){
//Loop through the entire container
for (auto&& b: _BATCHES)
if (b==data){
dynamic_cast<Batch<T>>(b)->draw(data);
}
//If no bach found, create a new One
createNewBatch(data);
}
これは、最初の問題を修正したが、その後、別の現れ、と私はプログラムからの私の静的関数を呼び出したいときには起こる:
BatchManager::render(_data);
エラーメッセージは次のようになります。
undefined reference to BatchManager::placeData<DataType>(DataType*)
問題?または私は何か間違っているのですか?
別に何か他のものから、アンダースコアと大文字で始まり\ _BATCHESのような名前は、C++の実装のために予約されている - あなたはあなた自身にそのような名前を作成するべきではありませんコード。 –
なぜ私は私の個人的な容器にアンダースコアと大文字の名前を付けるような悪い習慣があるのか分かりません。それはいくつかの問題を引き起こす可能性があることを意味しますか?(この問題に関係しません) – Pins
[クラステンプレートの静的メンバーの初期化]の可能な複製(http://stackoverflow.com/questions/3229883/static-member-initialization-in- –