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

Ho avviato un nuovo progetto perché stavo riscontrando lo stesso errore su un altro progetto più grande. L'errore si verifica quando provo ad allocare lo spazio utilizzando la nuova parola chiave. Se questo errore è sciocco per favore perdonami perché non ho programmato nulla negli ultimi mesi.Errore linker quando si utilizza una classe template?

/********************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; 
} 

risposta

10

A causa di una stranezza nel modello di compilazione C++ s ', non è possibile separare i file .he cpp modo molto pulito per le classi template. In particolare, qualsiasi unità di traduzione (file sorgente C++) che desidera utilizzare una classe template deve avere accesso all'intera definizione del modello. Questo è uno strano capriccio della lingua, ma sfortunatamente è qui per restare.

Un'opzione consiste nel mettere l'implementazione nel file di intestazione piuttosto che nell'origine, quindi non avere affatto un file .cpp. Ad esempio, potresti avere questa intestazione:

#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 

Spero che questo aiuti!

+0

"ma sfortunatamente è qui per restare" - finché non avremo moduli. \ * incrocia le dita * – Xeo

+0

FUNZIONA COME UN FASCINO, dovevo solo fare una piccola correzione alla tua soluzione. invece di aggiungere il codice nel file .h ho appena incluso il file .cpp nella parte inferiore del file .h. È lo stesso risultato come se entrambe le parti fossero nello stesso file. in "hijo.cpp" #ifndef hijo_cpp #define hijo_cpp e in fondo #endif ... u Grazie per la risposta ... – HoNgOuRu

+0

devo aspettare 8 minuti in più per segnare la domanda come risposta – HoNgOuRu

Problemi correlati