當你有一個(非模板化)類,它包含一個靜態成員,如:靜態成員變量
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