2013-10-09 9 views
6

sagen, dass ich die KlasseSind statische Template-Klassenvariablen mit unterschiedlichen Instanziierungen gleich?

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

Jetzt haben, was in den folgenden Zuweisungen geschehen?

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

Was wird nach dem Standard passieren? Habe ich zwei Versionen von MyClass :: myvar oder nur eine?

+3

Einfache Antwort, zwei – john

+1

@ShafikYaghmour Ich schreibe ein Handbuch für eine große Menge von Klassen, und diese Frage ist mir aufgefallen, weil ich eine statische Funktion habe, die einige statische Variablen setzt, und ich dachte, es könnte ein gutes sein Frage für die Öffentlichkeit. Wahrscheinlich zu wissen, was der Standard dazu sagt, ist besser als zu versuchen. –

+1

@TheQuantumPhysicist Ok, das macht Sinn, ich fand das Zitat aus dem Standard, das besagt, dass jede Spezialisierung eine Kopie aller statischen Mitglieder haben wird. –

Antwort

2

Da das OP ausdrücklich ein Zitat aus dem Standard angefordert hat, hier ist meine Antwort, die das entsprechende Zitat aus dem Standard enthält.

Jede Spezialisierung wird ihre eigene Kopie von myvar haben, die Sinn macht, da jeder seine eigene eindeutige Klasse ist. Der C++ Standard-Entwurf in Abschnitt 14.7Vorlage Instanziierung und Spezialisierung Absatz sagt (Hervorhebung von mir):

Jede Klasse Template-Spezialisierung aus einer Vorlage instanziiert hat seine eigene Kopie der statischen Mitglieder.

[ Example: 
template<class T> class X { 
    static T s; 
}; 
template<class T> T X<T>::s = 0; 
X<int> aa; 
X<char*> bb; 

X hat ein statisches Element s vom Typ int und X hat ein statisches Element s vom Typ char *. -end Beispiel]

7

Ja, es wird zwei Variablen mit zwei verschiedenen Werten geben. Aber das ist, weil die beiden völlig unabhängige Klassen sind. So funktionieren Vorlagen. Denken Sie nicht an sie als Klassen, sondern als eine Reihe von Regeln, nach denen Klassen gebaut werden.

+1

STL sagte einmal (paraphrasierend): "Schablonen sind Ausstechformen. Sie können Ausstechformen nicht essen, aber Sie können Plätzchen machen, die Sie mit einer Ausstechform essen können". : P – Simple

1

Eine vollständig 'neue Klasse' wird aus der Vorlage für 'jeden Typnamen' instanziiert. Und da statische Member an die Klasse gebunden sind, hat jede dieser Klassen ihre eigenen Kopien der statischen Variablen.

Verwandte Themen