我想构建一个只有静态数据成员和函数的模板类,基本上是一个带有一些内部数据的函数集合,我想填写代码的各个部分。我试图在到达之前将内容插入到数据成员中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
但我不能通过 via 做同样的事情wobble
?Foo
有没有办法获得与Bar
模板类相同的行为?