2010-07-12 22 views
103

me gustaría hacer esto:estático inicialización miembro de una plantilla de clase

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

pero no puedo ya something_relevant no es de tipo integral. No depende de T, pero el código existente depende de que sea un miembro estático de S.

Como S es la plantilla, no puedo poner la definición dentro de un archivo compilado. ¿Cómo resuelvo este problema?

Respuesta

137

Sólo definirlo en el encabezado:

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

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

Ya que es parte de una plantilla, al igual que con todas las plantillas que el compilador se asegurará de que sólo ha definido una vez.

+2

@sbi: no se viola la regla de una definición? –

+5

No, no si hablamos de plantillas. De lo contrario, las plantillas de función lo harían también. – sbi

+1

@sbi, @Prasoon: en realidad, Prasoon parece ser el primero. Pero sigo aceptando sbi's por el comentario sobre la ODR (que era mi principal preocupación). –

26

Esto funcionará

template <typename T> 
struct S 
{ 

    static double something_relevant; 
}; 

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