2012-02-07 11 views
5
I'm getting an "unresolved external symbol "public:__thiscall hijo<int>::hijo<int>(void)" referenced in function_main 

Comencé un nuevo proyecto porque estaba teniendo el mismo error en otro proyecto más grande. El error ocurre cuando trato de asignar espacio usando la nueva palabra clave. Si este error es tonto, perdóname porque no he programado nada en los últimos meses.Error del vinculador al usar una clase de plantilla?

/********************file hijo.h******************/ 
#pragma once 
#ifndef hijo_h 
#define hijo_h 

template <class A> 
class hijo 
{ 
public: 
    hijo(void); 
    ~hijo(void); 
}; 
#endif 


    /********************file hijo.cpp***************/ 
    #include "hijo.h" 
#include <iostream> 
using namespace std; 

template <class A> 
hijo<A>::hijo(void) 
{ 
} 
template <class A> 
hijo<A>::~hijo(void) 
{ 
} 
    /*********************at main() function ***************/ 

#include <iostream> 
#include "hijo.h" 

int main(){ 

    hijo<int> *h = new hijo<int>; <---- PROBLEM AT THIS LINE 

    system("pause"); 
    return 0; 
} 

Respuesta

10

Debido a la rareza en el modelo de compilación de C++ 's, no se puede separar archivos .cpp y .h forma muy limpia para las clases de plantilla. Específicamente, cualquier unidad de traducción (archivo fuente C++) que desee usar una clase de plantilla debe tener acceso a toda la definición de la plantilla. Esta es una extraña peculiaridad del lenguaje, pero desafortunadamente está aquí para quedarse.

Una opción es colocar la implementación en el archivo de encabezado en lugar de en el origen, y luego no tener un archivo .cpp. Por ejemplo, puede tener este encabezado:

#pragma once 
#ifndef hijo_h 
#define hijo_h 

template <class A> 
class hijo 
{ 
public: 
    hijo(void); 
    ~hijo(void); 
}; 

/* * * * Implementation Below This Point * * * */ 

template <class A> 
hijo<A>::hijo(void) 
{ 
} 
template <class A> 
hijo<A>::~hijo(void) 
{ 
} 

#endif 

Espero que esto ayude!

+0

"pero desafortunadamente está aquí para quedarse" - hasta que obtengamos los módulos. \ * cruza los dedos * – Xeo

+0

FUNCIONA COMO UN ENCANTO, solo tenía que arreglar un poco su solución. en lugar de agregar el código en el archivo .h acabo de incluir el archivo .cpp en la parte inferior del archivo .h. Es el mismo resultado que si ambas partes estuvieran en el mismo archivo. en "hijo.cpp" #ifndef hijo_cpp #define hijo_cpp y en la parte inferior #endif ... gracias u por su respuesta ... – HoNgOuRu

+0

tengo que esperar 8 minutos más para marcar la pregunta como se responde – HoNgOuRu

Cuestiones relacionadas