当您有一个包含静态成员的(非模板化)类时,例如:
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 的某些实例化(例如)foo.hpp的内存地址是否会因每个翻译单元而不同?Foo<T>::xFoo<int>::x