2013-10-09 79 views
6

說我有類具有不同實例的靜態模板類變量是否相同?

template <typename T> 
class MyClass 
{ 
    static int myvar; 
} 

現在會發生什麼事在下面的任務?

MyClass<int>::myvar = 5; 
MyClass<double>::myvar = 6; 

根據標準會發生什麼?我會有兩個版本的MyClass :: myvar或只有一個?

+3

簡單的答案,兩個 – john

+1

@ShafikYaghmour我正在編寫一個龐大的一組類的手冊,這個問題發生在我身上,因爲我有一個靜態函數,它設置了一些靜態變量,我認爲它可能是一個很好的向公衆提問。大概知道標準說什麼比嘗試更好。 –

+1

@TheQuantumPhysicist好吧,這是有道理的,我發現從標準的引用說,每個專業化將有任何靜態成員的副本。 –

回答

2

由於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]

7

是的,會有兩個變量和兩個不同的值。但那是因爲這兩個是完全無關的類。這就是模板的工作原理。不要把它們看作是階級,而是把它們看作是建立階級之後的一系列規則。

+1

STL曾經說過(解釋):「模板是曲奇刀,你不能吃餅乾刀,但你可以用餅乾刀做餅乾。 :P – Simple

1

從'each typename'的模板實例化完全'新類'。由於靜態成員與類綁定,所以這些類中的每一個都有自己的靜態變量副本。

相關問題