关于类静态成员的初始化问题?
代码如下
#include<iostream>#include<vector>using namespace std;template<int len, int beg_pos>class num_sequence { friend ostream& operator << (ostream &os, const num_sequence<len,beg_pos> &ns) ;public: virtual ~num_sequence() {}; int elem( int pos ) const; const char* what_am_i() const; static int max_elems() { return _max_elems;} virtual ostream& print(ostream &os = cout) const;protected: virtual void gen_elems( int pos ) const = 0; bool check_integrity( int pos, int size ) const; num_sequence(vector<int> *p) : _pelems(p) {} static const int _max_elems = 1024; vector<int> *_pelems;};template<int len, int beg_pos>bool num_sequence<len,beg_pos>::check_integrity(int pos, int size) const { if ( pos < 0 || pos > _max_elems) return false; if(pos >= _pelems->size()) gen_elems(pos); return true;}template<int len, int beg_pos>int num_sequence<len,beg_pos>::elem( int pos ) const { if ( ! check_integrity(pos,_pelems->size())) return 0; return (*_pelems)[pos-1];}template<int len, int beg_pos>const char* num_sequence<len,beg_pos>::what_am_i() const { return typeid(*this).name();}template<int len, int beg_pos>ostream& num_sequence<len,beg_pos>::print(ostream &os) const { int elem_pos = beg_pos; int end_pos = beg_pos + len; if ( !check_integrity(elem_pos,end_pos)) return os; while(elem_pos < end_pos) { os << (*_pelems)[elem_pos++] << ' '; } return os;}template<int len, int beg_pos>ostream& operator<< (ostream &os, const num_sequence<len,beg_pos> &ns) { ns.print(os); return os;}template<int len, int beg_pos=1>class Fibonacci : public num_sequence<len,beg_pos> {public: virtual ~Fibonacci(){} Fibonacci() : num_sequence<len,beg_pos>(&_elems){} void print(ostream& os) { num_sequence<len,beg_pos>::print(os);} static void init_elems(int count=1) { _elems.reserve(count);}private: virtual void gen_elems( int pos ) const; static vector<int> _elems;};template<int len, int beg_pos>vector<int> Fibonacci<len,beg_pos>::_elems;template<int len, int beg_pos>void Fibonacci<len,beg_pos>::gen_elems( int pos ) const { if ( _elems.size() <= 2) { _elems.push_back(1); _elems.push_back(1); } int length = _elems.size(); if (length <= pos) { int n_1 = _elems[length - 2]; int n_2 = _elems[length - 1]; int sum; while( length < pos ) { sum = n_1 + n_2; _elems.push_back(sum); n_1 = n_2; n_2 = sum; length++; } }}int main() { Fibonacci<8> fib1; fib1.print(cout); return 0;}