16.4.7.static Members of Class Templates
template<class T> class Foo {
public:
staticstd::size_t count() { return ctr; }
//other interface members
private:
staticstd::size_t ctr;
//other implementation members
};
Each instantiation of class Foohas its own staticmember:
//Each object shares the same Foo<int>::ctrand Foo<int>::countmembers
Foo<int>fi, fi2, fi3;
//has static members Foo<string>::ctrand Foo<string>::count
Foo<string>fs;
Usinga staticMember of a Class Template
Of course, when we attempt to use
the staticmember through the class, we must refer to anactual instantiation:
Foo<int>fi, fi2; // instantiates Foo<int> class
size_tct = Foo<int>::count(); // instantiates Foo<int>::count
ct =fi.count(); // ok: uses Foo<int>::count
ct =fi2.count(); // ok: uses Foo<int>::count
ct =Foo::count(); // error: which template instantiation?
Like any other memberfunction, a staticmember function is instantiated only if it is used in a program.
Defininga static Member
As with any otherstaticdata member, there must be a definition for the data member that appearsoutside the class. In the case of a class template static, themember definition must inidicate that itis for a class template:
template<class T>
size_tFoo<T>::ctr = 0; // define and initialize ctr