2013-10-09 8 views
6

Dire che ho la classeLe variabili di classe template statiche con diverse istanze sono uguali?

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

Ora cosa accadrà nei seguenti assegnazioni?

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

Cosa succederà secondo lo standard? Avrò due versioni di MyClass :: myvar o solo una?

+3

Risposta semplice, due – john

+1

@ShafikYaghmour Sto scrivendo un manuale per un enorme insieme di classi, e questa domanda mi è venuta in mente, perché ho una funzione statica che imposta alcune variabili statiche, e ho pensato che potesse essere una buona domanda per il pubblico. Probabilmente sapere cosa dice lo standard a riguardo è meglio che provare. –

+1

@TheQuantumPhysicist Ok, questo ha senso, ho trovato la citazione dallo standard che dice che ogni specializzazione avrà una copia di qualsiasi membro statico. –

risposta

2

Poiché l'OP ha richiesto specificamente una citazione dallo standard, ecco la mia risposta che include la citazione pertinente dallo standard.

Ogni specializzazione avrà la propria copia di myvar che ha senso dal momento che ognuno è il proprio distinto classe. Il ++ progetto di norma C nella sezione 14.7 esemplificazione Template e specializzazione paragrafo dice (sottolineatura mia):

Ogni classe template specializzazione un'istanza da un modello ha la propria copia di tutti i membri statici.

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

X ha un membro statico s di tipo int e X ha un membro statico s di tipo char *. -end esempio]

7

Sì, ci saranno due variabili con due valori diversi. Ma questo perché i due sono classi completamente indipendenti. Ecco come funzionano i template. Non pensarli come classi, ma piuttosto come un insieme di regole dopo le quali vengono costruite le classi.

+1

STL una volta ha detto (parafrasi): "i modelli sono tagliabiscotti.Non puoi mangiare i tagliabiscotti ma puoi fare i biscotti che puoi * mangiare * con un tagliabiscotti". : P – Simple

1

Un completamente 'nuova classe' viene creata un'istanza dal modello per 'ogni typename'. E poiché i membri statici sono legati alla classe, ognuna di queste classi ha le proprie copie della variabile statica.