静的データ メンバーと関数のみでテンプレート化されたクラスを構築したいと考えています。基本的には、コードのさまざまな部分に入力したい内部データを含む関数のコレクションです。に到着する前に、コンテンツをデータ メンバーに挿入しようとしていますmain()
。これは、テンプレート化されていないクラスではうまく機能しますが、テンプレート化されたクラスでは、それを機能させる方法がわかりません。
コードは次のとおりです。
#include <iostream>
#include <vector>
class Foo{
private:
static std::vector<unsigned> content;
public:
static void insert(unsigned u){ content.push_back(u); }
static size_t size(){ return content.size(); }
};
std::vector<unsigned> Foo::content=std::vector<unsigned>();
struct Bar{
Bar(){ Foo::insert(0); }
} bar;
// this works fine in gcc, but is this consistent or am I lucky?
// Foo::content will contain 0 prior to entering main
template <typename T>
class Quux{
private:
static std::vector<T> content;
public:
static void insert(T t){ content.push_back(t); }
static size_t size(){ return content.size(); }
};
template <typename T>
std::vector<T> Quux<T>::content=std::vector<T>();
struct Wobble{
Wobble(){ Quux<unsigned>::insert(0); }
} wobble;
// this does not work
// Quux<unsigned>::content will be empty prior to entering main
int main(){
std::cout << Foo::size() << std::endl;
// outputs 1, as desired
std::cout << Quux<unsigned>::size() << std::endl;
// outputs 0, makes me sad :(
Wobble wobble2;
std::cout << Quux<unsigned>::size() << std::endl;
// outputs 1, as desired
}
出力:
1
0
1
Foo
はテンプレート化されていないクラスであり、構造体を介してFoo::content
実行する前に問題なく挿入できます。私が幸運であるのではなく、これが一貫した行動であることを願っていますか?main()
Bar
ただし、テンプレート化されたクラスに対して同じことをしようとすると、何かを追加できるようにQuux<T>
なるまで待つ必要があるようです。main()
なぜこれが必要なのか、そして(うまくいけば)それを回避する方法を誰かが説明できますか?テンプレートのインスタンス化の時間と関係があると思いますが、正確な理由はわかりません。Quux<unsigned>
次の後に完全に利用できるようになると思います。
struct Wobble{
Wobble(){ Quux<unsigned>::insert(0); }
} wobble;
ここで何が欠けていますか?main
viaの前にテンプレート化されていないクラスにコンテンツを追加できるのに、なぜbar
同じことができないのwobble
ですか? テンプレート化されたクラスFoo
と同じ動作を得る方法はありますか?Bar