1. 定义
与任何其他static数据成员相同,模板类的每个static数据成员必须有且仅有一个定义。类模板的每个实例都有一个独有的static对象。
eg. Foo是一个类模板
有一个名为count的public static 成员函数一个名为ctr的private static数据成员。
每个Foo的实例都有其自己的static成员实例。即,对任意给定类型x,都有一个Foo: :ctr和一个Foo: : count成员。所有Foo类型的对象共享相同的ctr对象和count函数。
template <typename T> class Foo {public:static std: :size_ t count () {return ctr; }//其他接口成员private :static std: :size t ctr;//其他实现成员};//实例化static成员Foo<string>: :ctr和Foo<string>: :countFoo<string> fs;//所有三个对象共享相同的Foo<int>: :ctr和Foo<int>: :count成员Foo<int> fi, fi2, fi3; Foo<int> fi;//实例化Foo<int>类和static数据成员ctrauto ct = Foo<int>: :count() ; // 实例化Foo<int>: : countct = fi.count () ;//使用Foo<int>: :countct = Foo: :count() ;//错误:使用哪个模板实例的count?
1.1 变量初始化
template size t Foo: :ctr = 0; //定义并初始化ctr .
1.2 类似任何其他成员函数,一个static成员函数只有在使用时才会实例化。