当您有一个包含静态成员的(非模板化)类时,例如:
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>::x
Foo<int>::x