2010-07-12 37 views
103

mi piacerebbe fare questo:inizializzazione statico membro in un modello di classe

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

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

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

risposta

137

Proprio 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 è parte di un modello, come con tutti i modelli il compilatore farà in modo che è definito solo una volta.

+2

@sbi: non è vero viola la regola di una definizione? –

+5

No, non se stiamo parlando di modelli. Altrimenti anche i modelli di funzione lo farebbero. – sbi

+1

@sbi, @Prasoon: in realtà Prasoon sembra essere il primo. Ma continuo ad accettare sbi a causa del commento sull'ODR (che era la mia preoccupazione principale). –

26

Ciò funzionerà

template <typename T> 
struct S 
{ 

    static double something_relevant; 
}; 

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