2012-10-09 27 views
15

Tengo un código en el que debo reenviar-declarar una clase de plantilla (o al menos, declarar hacia adelante me facilitaría mucho las cosas. ..). He escrito una versión simplificada del problema que estoy teniendo así que puede mostrar aquí:"Ejemplificación implícita de plantilla indefinida" cuando la clase de plantilla que declara hacia adelante

template<bool> 
class MyTemplateClass; 

int main(int argc, char* argv[]) 
{ 
    MyTemplateClass<false> myTemp; // error here 
    myTemp.GetTheValue(); 
    return 0; 
} 

template<bool bShouldMult> 
class MyTemplateClass 
{ 
    int m_myint; 
    float m_myfloat; 

public: 
    MyTemplateClass() : m_myint(5), m_myfloat(3.0f) {} 
    float GetTheValue() 
    { 
     return m_myint * (bShouldMult ? m_myfloat : 1.0f); 
    } 

}; 

El error que estoy recibiendo en la línea comentada es:

Error - implicit instantiation of undefined template 'MyTemplateClass<false>' 

¿Qué otros detalles ¿Necesito incluir en una declaración futura de MyTemplateClass? Como el error no viene de la siguiente línea, supongo que no se debe al hecho de que el método no está definido. El compilador que estoy usando es LLVM/CLang, y estoy compilando en Mac.

Respuesta

13

Con el fin de declarar una variable de cualquier tipo, plantilla o no, toda la definición de ese tipo debe estar disponible. No puede reenviar-declarar una plantilla, y luego comenzar a usarla como si estuviera definida. Todo lo que se puede hacer en ese momento es declarar un puntero a un objeto de un tipo basado en la plantilla, así:

MyTemplateClass<false> *myTempPtr; // No error here 

Desafortunadamente (pero no de forma inesperada) Esto mueve el error a la siguiente línea. El problema de inicializar ese puntero permanece: una vez que intenta invocar new MyTemplateClass<false>, verá un error.

Necesita volver a organizar su código para mover la definición de la plantilla antes de su lugar de uso. Esto puede ser algo tedioso, pero no hay forma de evitarlo: el compilador necesita tener toda la definición en el punto en el que comienza a crear instancias de su plantilla y llama a sus métodos.

0

Según mi entender, no puede reenviar declarar algo y luego crear una instancia en su pila (plantilla o no).

Además, no creo que hay un muy amplio apoyo para la definición de la clase de plantilla hacia adelante

19

Olvidó #include algo?

Tengo esto después de olvidar a

#include <array> 

Cuando se utiliza un std::array

Cuestiones relacionadas