Dado el siguiente código:

 void f()
 {
     class A
     {
         template <typename T>
         void g() {}
     };
 }

g++ 4.4 (y también g++-4.6 -std=gnu++0x) se queja: «no válido declaración de miembro de la plantilla en el local de la clase».

Aparentemente local, las clases no se permite a los miembros de la plantilla. ¿Cuál es el propósito de esta limitación? Va a ser eliminado en C++0x?

Nota: Si hago el local de la clase en sí una plantilla, en lugar de darle un miembro de plantilla:

 void f()
 {
     template <typename T>         
     class A
     {
         void g() {}
     };
 }

Me sale «error: una declaración de la plantilla no puede aparecer en el ámbito de bloque».

  • Me encontré con esta vieja pregunta, mientras que luchan con g++-4.6. Todavía se queja, así que he editado la cuestión un poco. Espero que podamos conseguir más respuestas!
  • Por desgracia, no hay mucho más que decir en este punto. Como litb señaló en su comentario a Crazy Eddie respuesta, C++11 ¿no agregar soporte para las clases locales que son plantillas o tienen los miembros de la plantilla (se agregó soporte para el uso de las clases locales como los parámetros de la plantilla a otro (no local) de la clase, pero eso es otra característica). Así, g++, no se espera que el apoyo de este en el futuro cercano, excepto, quizá, como una extensión de compilador. Creo que es una lástima, porque hubiera sido una característica útil, pero bueno, siempre hay C++24…
  • c++14 permite genérico de lambdas a ser definido localmente con variadic argumentos. Estos están muy cerca de las plantillas y por lo tanto podría ser una solución adecuada

1 Comentario

  1. 12

    El objetivo de esta limitación? Sólo una conjetura, pero:

    • puede utilizar la clase de plantilla/plantilla de función miembro sólo dentro de la envolvente de la función. Por lo tanto, ustedes ya saben todos los tipos utilizados dentro de la función y, por tanto, puede especificar directamente los tipos utilizados (de varios tipos, por supuesto, la plantilla variante habría ahorrado algunos escribir).
    • a pesar de lo que pudiera parecer, es un trabajo para todos compilador de los creadores y el espacio para los errores y debe ser así vale la pena el esfuerzo.

    Hecho de la diversión: Trate de usar una clase dentro de una función como un tipo de retorno de un (c++0x)-función lambda declarado en la función: MSVC 2010: error interno del compilador ^^.

    • Usted puede saber los tipos que se utilizan, pero todavía le impide el uso de SFINAE trucos, sin necesidad de exponer el ayudante de estructuras.
    • En realidad, cuando el local de la clase es usado por el visitante con boost::apply_visitor en un impulso::variante que no conocer el tipo.
    • Tampoco conoces los tipos implicados si la función es en sí mismo una plantilla. Esta limitación es más probable que sea más fácil para los programadores de compiladores, aunque yo no puedo ver por qué. Debe ser capaz de reutilizar el código que es para no-plantillas locales.

Dejar respuesta

Please enter your comment!
Please enter your name here