我想要建立一個只有靜態數據成員和函數的模板類,基本上是一些函數的集合,我想要填充代碼的各個部分。我試圖在到達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
通過結構Bar
就好運行main()
之前插入的東西。我希望這是一貫的行爲,而不是我幸運?
但是,當我嘗試爲模板類Quux<T>
做同樣的事情時,似乎我必須等到main()
才能添加內容。有人可以解釋爲什麼這是必要的(希望)解決方法?我認爲它與模板實例化的時間有關,但我無法弄清楚爲什麼。我希望Quux<unsigned>
是完全可用後執行以下操作:
struct Wobble{
Wobble(){ Quux<unsigned>::insert(0); }
} wobble;
缺少什麼我在這裏?爲什麼我可以在main
之前通過bar
將內容添加到非模板類中,但是我不能通過wobble
做同樣的事情嗎?有沒有什麼方法可以獲得與模板類中的Foo
和Bar
相同的行爲?
如果從'Quux <> :: content'中刪除初始值設定項,會發生什麼?矢量將始終初始化爲空。 – arne
@arne萬事大吉! '/tmp/cc9EjNZp.o:函數'Quux :: insert(unsigned int)': sscce.cpp :(.text._ZN4QuuxIjE6insertEj [Quux :: insert(unsigned int)] +在函數'Quux :: size()'中: sscce.cpp :(.text._ZN4QuuxIjE4sizeEv [ Quux :: size()] + 0x5):未定義引用Quux :: content' collect2:ld返回1退出狀態 ' –
如果添加'Quux'的明確實例' *在'class Wobble'的定義之前,它按預期工作。 –
dyp