template <typename T>
class MyClass
{
static int myvar;
}
現在會發生什麼事在下面的任務?
MyClass<int>::myvar = 5;
MyClass<double>::myvar = 6;
根據標準會發生什麼?我會有兩個版本的MyClass :: myvar或只有一個?
template <typename T>
class MyClass
{
static int myvar;
}
現在會發生什麼事在下面的任務?
MyClass<int>::myvar = 5;
MyClass<double>::myvar = 6;
根據標準會發生什麼?我會有兩個版本的MyClass :: myvar或只有一個?
由於OP特別要求標準報價,這裏是我的答案,其中包括來自標準的相關報價。
每個專業都有自己的myvar
副本,這是有道理的,因爲每個專業都是自己獨特的類。在第14.7
模板實例化和專業化款說C++標準草案(重點煤礦):
每個類模板特從模板實例都有自己的任何靜態成員的副本。
[ Example: template<class T> class X { static T s; }; template<class T> T X<T>::s = 0; X<int> aa; X<char*> bb;
X具有int類型的靜態成員S和X具有char類型的靜態成員S *。 - end example]
是的,會有兩個變量和兩個不同的值。但那是因爲這兩個是完全無關的類。這就是模板的工作原理。不要把它們看作是階級,而是把它們看作是建立階級之後的一系列規則。
STL曾經說過(解釋):「模板是曲奇刀,你不能吃餅乾刀,但你可以用餅乾刀做餅乾。 :P – Simple
從'each typename'的模板實例化完全'新類'。由於靜態成員與類綁定,所以這些類中的每一個都有自己的靜態變量副本。
簡單的答案,兩個 – john
@ShafikYaghmour我正在編寫一個龐大的一組類的手冊,這個問題發生在我身上,因爲我有一個靜態函數,它設置了一些靜態變量,我認爲它可能是一個很好的向公衆提問。大概知道標準說什麼比嘗試更好。 –
@TheQuantumPhysicist好吧,這是有道理的,我發現從標準的引用說,每個專業化將有任何靜態成員的副本。 –