Inizializzazione di membri statici in un modello di classe


148

Mi piacerebbe fare questo:

template <typename T>
struct S
{
    ...
    static double something_relevant = 1.5;
};

ma non posso dato che something_relevantnon è di tipo integrale. Non dipende da T, ma il codice esistente dipende dal fatto che è un membro statico di S.

Poiché S è un modello, non riesco a inserire la definizione in un file compilato. Come posso risolvere questo problema?


vale anche per il std::stringtipo
Trevor Boyd Smith,

Da c ++ 11 la parola chiave inline è cambiata in modo che le variabili statiche possano essere inizializzate nel punto di dichiarazione. Quindi la dichiarazione per questo apparirebbe come "inline static double something_relevant = 1.5;"

@ user8991265 Credo che le variabili inline siano disponibili da C ++ 17, non C ++ 11.
zupazt3,

Risposte:


196

Basta definirlo nell'intestazione:

template <typename T>
struct S
{
    static double something_relevant;
};

template <typename T>
double S<T>::something_relevant = 1.5;

Dal momento che fa parte di un modello, come con tutti i modelli, il compilatore si assicurerà che sia definito solo una volta.


4
@sbi: non viola la regola dell'unica definizione?
Alexandre C.,

7
No, non se stiamo parlando di modelli. Altrimenti lo farebbero anche i template di funzione.
sabato

1
@sbi, @Prasoon: in realtà Prasoon sembra essere il primo. Ma accetto ancora gli sbi a causa del commento sull'ODR (che era la mia preoccupazione principale).
Alexandre C.,

1
@sbi passa il mouse sopra il testo :)
Johannes Schaub - litb

5
@Johannes: Accidenti, sono qui da un anno e non lo sapevo! Cos'altro mi manca? (Ricordo ancora la vergogna quando ho scoperto che i due numeri che compaiono quando faccio clic sul numero di voti non sono un bug, ma una caratteristica.) <goes_playing>Caspita, quando passo sopra il tuo nome, vedo il tuo rappresentante! Non lo sapevo neanche io. @Prasoon: No, hai ragione, sono arrivato iterativamente dove si trova ora. (Ecco perché ho votato a favore della tua risposta, BTW.)
sabato


31

Questo funzionerà

template <typename T>
 struct S
 {

     static double something_relevant;
 };

 template<typename T>
 double S<T>::something_relevant=1.5;

Non ho definito la variabile something_relevant (ho rimosso l' template<typename T> double S<T>::something_relevant=1.5;)errore di lancio del compilatore. Puoi dirmi qual è il motivo?
goodman
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.