Se una definizione di classe template contiene una variabile membro statica che dipende dal tipo di modello, non sono sicuro di quale dovrebbe essere il comportamento affidabile?Cosa dovrebbe accadere alle variabili membro statiche della classe template con definizione nel file .h
Nel mio caso è auspicabile inserire la definizione di tale membro statico nello stesso file .h come la definizione della classe, dal momento che
- voglio la classe di essere generale per molti tipi di dati modello che ho non attualmente sapere.
- Voglio solo un'istanza dell'elemento statico da condividere in tutto il mio programma per ogni tipo di modello specificato. (Uno per tutti
MyClass<int>
e uno per tuttiMyClass<double>
, ecc
posso essere più breve dicendo che il codice elencato at this link si comporta esattamente come voglio quando viene compilato con GCC 4.3. E 'questo comportamento in base a standard C++ in modo che posso contare su di esso quando si utilizzano altri compilatori?
tale nesso non è il mio codice, ma un esempio di contatore pubblicato da CodeMedic alla discussione here. ho trovato molti altri dibattiti come questo one ma nulla che io considero conclusivo
Penso che Il linker sta consolidando le molteplici definizioni trovate (nell'esempio a.o
e b.o
). È questo il comportamento del linker richiesto/affidabile?
Ok, quindi sia il codice di esempio che il comportamento che sto vedendo sono conformi allo standard? In realtà ... ecco cosa manca per suggellare la vittoria: cosa dice che non ci saranno più istanze dello specifico membro statico nel programma, quindi la variabile statica avrebbe lo stesso valore tra tutte le unità di traduzione? Questo per quanto posso capire avrebbe bisogno di essere un po 'di consolidamento al momento del collegamento. – NoahR
@NoahR: tutte le istanze del membro statico saranno collegate alla stessa variabile effettiva, quindi il valore sarà realmente condiviso. Penso che se non si scrive un'inizializzazione esplicita, si ottiene l'inizializzazione di default (o inizializzazione del valore, ho dimenticato, l'impostazione predefinita è zero), ma si potrebbe anche scrivere '= 0;' nel file di intestazione. –
Grazie a @Kerrek SB. Pertanto, i membri statici di una classe template ricevono un trattamento diverso rispetto ai membri statici di una classe non template. Dico questo perché ho trovato un sacco di esempi per concludere che fornire la definizione del membro statico nel file .h per la classe non di modello genera un errore di simbolo duplicato in fase di collegamento ed è una violazione della regola di una definizione. In ogni caso, la domanda in questione: è il consolidamento del collegamento di un membro statico di classe modello richiesto dallo standard? – NoahR