Puede una plantilla de clase en C++ tiene miembros estáticos? Ya que no existe y es incompletos antes de usarlo, es esto posible?

  • Tu pregunta no es clara. Aquí es la clase de plantilla que tiene miembros estáticos: codeproject.com/KB/cpp/value_t.aspx a Flote desde el año 2004.
  • C++ expertos prefieren el término «plantilla de clase», porque una plantilla de clase es una plantilla, no una clase. Que ayuda a eludir el «no existe» suposición hecha anteriormente. La plantilla de clase obviamente existe. Simplemente no se tiene ningún tipo de casos, sin embargo, y es en esas plantilla de instancias que pueden tener los miembros.
  • Como una extensión a este, y a @Potatoswatter la respuesta, ¿qué cambios se si quiero declarar static T foo; en mi plantilla de clase? En el caso de uso que me estoy planteando, el conjunto de tipos que serán utilizados son bastante limitados, está garantizado que van a ser básicos POD tipo, por ejemplo,int, float, uint64_t etc.etc.etc. Puedo crear todos los miembros estáticos declarationsI creo que voy a necesitar, y si es necesario, añadir más si es un nuevo tipo es usado como el tipo de plantilla, que conduce a una referencia indefinida?
InformationsquelleAutor rubixibuc | 2011-04-29

1 Comentario

  1. 33

    Sí. El miembro estático es declarado o definido dentro de la template< … > class { … } bloque. Si es declarado pero no se define, entonces, debe haber otra declaración que proporciona la definición de los estados.

    template< typename T >
    class has_static {
        //inline method definition: provides the body of the function.
        static void meh() {}
    
        //method declaration: definition with the body must appear later
        static void fuh();
    
        //definition of a data member (i.e., declaration with initializer)
        //only allowed for const integral members
        static int const guh = 3;
    
        //declaration of data member, definition must appear later,
        //even if there is no initializer.
        static float pud;
    };
    
    //provide definitions for items not defined in class{}
    //these still go in the header file
    
    //this function is also inline, because it is a template
    template< typename T >
    void has_static<T>::fuh() {}
    
    /* The only way to templatize a (non-function) object is to make it a static
       data member of a class. This declaration takes the form of a template yet
       defines a global variable, which is a bit special. */
    template< typename T >
    float has_static<T>::pud = 1.5f; //initializer is optional

    Separado un miembro estático se crea para cada parametrización de la plantilla. No es posible tener un solo miembro compartido a través de todos las clases generadas por la plantilla. Para ello, debe definir otro objeto fuera de la plantilla. Una parte especializada de los rasgos de la clase puede ayudar con eso.

    • Yo no estoy segura de lo que quieres decir con el comentario: «const integral de tipos puede ser definida» y «otros tipos no pueden». Lo que esto significa para mí, es que los miembros estáticos necesidad de ser constante, pero este no es el caso. Un caso de uso de la no-const integral de los miembros es el CRTP contador de aplicación, habida cuenta de aquí.
    • Una constante de tipo integral puede ser definido (no se limitó a declarar) dentro de llaves de la clase bloque. Otros tipos deben ser declaradas dentro de las llaves y define más adelante en el ámbito de espacio de nombres.
    • ampliado en los comentarios un poco.
    • Debería haber preguntado esto antes, pero ¿cómo se invoca?
    • ¿Cómo se lo invoca?
    • Los métodos estáticos de la clase de plantilla y los campos estáticos. Se debe crear una instancia de alguna manera la primera o utilizar una sintaxis especial?
    • Se crea una instancia cuando se utilizan, como los métodos no estáticos. Igualmente, la declaración debe ser válido en cualquier caso, es sólo la inicialización (análoga a la del cuerpo de la función) que se aplace hasta el uso de los miembros. Para los miembros de datos estáticos, la sintaxis especial es la declaración en el ámbito de espacio de nombres, fuera de la class bloque, que debe aparecer en exactamente una unidad de traducción (no un encabezado).
    • Podría usted por favor ampliar esta respuesta para mostrar la forma de escribir, si usted quiere crear una instancia de una función miembro estática para un tipo específico en un archivo cpp, que incluye este archivo de encabezado?
    • Para cualquier persona que visita este hilo más tarde, se crea la instancia de la función fuh por escrito has_static<int>::fuh() (o con cualquier otro tipo en el lugar de int, ya que esta clase no realmente uso la int).

Dejar respuesta

Please enter your comment!
Please enter your name here