当你有一个(非模板化)类,它包含一个静态成员,如:静态成员变量
class Foo
{
public:
static int x;
};
然后Foo::x
必须在一个被定义的,仅一个转换单元,或者编译器会抱怨多种定义。因此,在somefile.cpp
你必须定义它:
int Foo::x = 10;
这样,访问Foo::x
被访问相同的内存地址的转换单元。
但如果Foo
是类模板?现在
template <class T>
class Foo
{
public:
static int x;
};
,Foo<T>::x
可以在头文件中定义,说:
template <class T>
int Foo<T>::x = 10;
所以,如果类模板Foo
在foo.hpp
和translation_unit1.cpp
和translation_unit2.cpp
既包括foo.hpp
定义,会记忆为模板类Foo的一些实例的Foo<T>::x
地址,(如Foo<int>::x
例如)对于每个转换单元不同?
只有一次'Foo :: x'的实例,链接器会照顾它。 –
[this](http://stackoverflow.com/questions/19341360/is-static-member-variable-initialized-in-a-template-class-if-the-static-menber-i/19341402#19341402)is不是愚蠢的,但它有一些关于如何静态成员和模板一起工作的标准报价 – aaronman