c++ - “Creación de instancias implícita de una plantilla no definida” cuando se reenvía la clase de plantilla.
templates clang (3)
Tengo un código en el que necesito declarar hacia adelante la clase de plantilla (o al menos, declarar hacia adelante me facilitaría mucho las cosas ...). He escrito una versión simplificada del problema que tengo para poder mostrarla aquí:
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é otro detalle necesito incluir en una declaración hacia adelante de MyTemplateClass? Dado que el error no viene de la siguiente línea hacia abajo, 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.
¿Te olvidaste de #include
algo?
Conseguí esto después de olvidarme de
#include <array>
Cuando se usa un std::array
: ^)
Para declarar una variable de cualquier tipo, plantilla o no, la definición completa de ese tipo debe estar disponible. No puede reenviar una plantilla y luego comenzar a usarla como si estuviera definida. Todo lo que puedes hacer en ese momento es declarar un puntero a un objeto de un tipo basado en la plantilla, como esto:
MyTemplateClass<false> *myTempPtr; // No error here
Desafortunadamente (pero no inesperadamente) esto mueve el error a la siguiente línea. El problema de inicializar ese puntero permanece: una vez que intente invocar una new MyTemplateClass<false>
, verá un error.
Debe reorganizar 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 debe tener la definición completa en el punto en el que comienza a crear una instancia de su plantilla y llamar a sus métodos.
Por lo que entiendo, usted no puede reenviar algo y luego crear una instancia en su pila (plantilla o no).
Además, no creo que haya un soporte muy amplio para la definición de la clase de plantilla.