Me gustaría hacer esto:

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

pero no puedo ya que 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.

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

  • también se aplica a std::string tipo
  • Debido a que c++11 la palabra clave inline ha cambiado, de manera que las variables estáticas pueden ser inicializadas en el momento de la declaración. Así que la declaración sería como «inline static double something_relevant = 1.5;»
InformationsquelleAutor Alexandre C. | 2010-07-12

3 Comentarios

  1. 170

    Acaba de definir en la cabecera:

    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, como con todas las plantillas que el compilador de asegurarse de que sólo se define de una vez.

    • no se viola la definición de la regla ?
    • No, si estamos hablando de plantillas. De lo contrario, la función de plantillas de hacerlo, también.
    • en realidad Prasoon parece ser la primera. Pero yo todavía aceptar sbi por el comentario acerca de la ODR (que era mi principal preocupación).
    • ¿Cómo llegar a la hora exacta? Para mí, sólo muestra «hace 1 hora» de cada uno. Sé que puedo ordenarlos por «más antiguas» y «nuevas», y se mostrará la hora exacta en tres días (hasta luego dice: «2 días»), pero no tengo idea de cómo llegar a la hora exacta ahora.
    • simplemente coloca el cursor sobre el texto 🙂
    • Schaub -litb: Francamente, cuando vi sbi la respuesta de las dos últimas líneas fueron template <typename T> double something_relevant<T> = 1.5; que es sintácticamente incorrecta(que podría haber perdido algo );-). Así que me decidí a publicar mi solución.
    • Si usted piensa que hay algo mal en mi último comentario, favor de hacer mención 🙂
    • Maldita sea, estoy aquí por un año y yo no sabía eso! ¿Qué otra cosa que me estoy perdiendo? (Todavía me acuerdo de la vergüenza cuando descubrí que los dos números que aparecen cuando hago clic en el número de votos no es un bug, sino una característica.) <goes_playing> Wow, cuando me pase el ratón sobre su nombre, veo su rep! Yo no sabía que uno sea. @Prasoon: No, tienes razón, yo de forma iterativa llegó a donde está ahora. (Por eso es que yo hasta votado tu respuesta, por CIERTO.)
    • Ah, siempre me he preguntado lo que representaba.(Y, sí, Imagino que es una maravillosa canción.) @James: Que sonó una campana: «Mi estilo de pelo de llama en la pregunta inmediata todos mis juicios.», cerca del final de la publicación)
    • Lo que si la clase está incluida en el espacio de nombres?
    • Entonces usted necesita para poner las cosas en dicho espacio de nombres?
    • Para enturbiar las aguas, ¿cómo podemos inicializar 5 o 6 especializaciones de T? He estado tratando de la {sencilla|obvia} respuesta en Cómo inicializar un miembro estático de una parametrización de la plantilla de clase, pero el Ruido se mantiene en su defecto el enlace debido a mulitply símbolos definidos porque el encabezado se utiliza en varios archivos de código fuente. En nuestro caso, la variable de clase es static const y es como que las cosas están escapando de la traducción ámbito de la unidad.
    • Si se define a los miembros estáticos de casos concretos, en lugar de la base de la plantilla, usted tendrá que poner en archivos cpp. Hay trucos de todo esto, pero que agregar difíciles de leer las verrugas a su código.

  2. 31

    Esto funcionará

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

Dejar respuesta

Please enter your comment!
Please enter your name here