2012-10-15 19 views
5

Sto cercando di usare una classe template e quando ho compilare in un unico file in LWS funziona: http://liveworkspace.org/code/a9c412a7e683439dfa35a9363749369dTemplate errore di generazione: i simboli non definiti per l'architettura x86_64:

Ma quando provo a compilare ha fatto-up di 3 file,

linee stack.h 4 a 21

linee stack.cpp 24 a 48

linee mAIN.CPP 49 per terminare

Quando provo a compilare quei 3 file che ricevo

Undefined symbols for architecture x86_64: 
    "Stack2<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::push(Node**, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)", referenced from: 
     _main in ccCoizCT.o 
    "Stack2<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::top(Node*&)", referenced from: 
     _main in ccCoizCT.o 
    "Stack2<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::pop(Node*&)", referenced from: 
     _main in ccCoizCT.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 

stack.h Sì ho incluso in un file stack.cpp e Main.cpp

+1

I vostri corpi funzione template devono essere tutti nei file di intestazione. Se li hai ritagliati usando le linee che hai menzionato, hai i corpi <> del modello in file .cpp, devono essere disponibili affinché il compilatore esegua la deduzione, e quindi devono essere nel file di intestazione. – WhozCraig

+0

quindi quali linee devo inserire nel file di intestazione? –

+1

A giudicare dal tuo codice, non dovresti nemmeno * avere * un file stack.cpp, se questo ti aiuta. Sposta tutte le implementazioni dei modelli di stack nella tua intestazione. – WhozCraig

risposta

7

Suona come è necessario inserire le definizioni di modello di impilare nuovamente nel file di intestazione. I modelli formano un piano per la generazione del codice, quindi se il compilatore non può vedere l'intera definizione del modello e vede solo la dichiarazione, il codice per quella specifica istanza del modello non verrà generato. Semplicemente si fida della dichiarazione e si aspetta che al momento del collegamento esista un file di oggetti con le istanze di quei modelli. La soluzione a questo è 1) mantenere le definizioni del modello nel file di intestazione o 2) pregenerare le definizioni richieste in modo che il linker possa trovarle al momento del collegamento.

vedere qui: Template issue causes linker error (C++)

Problemi correlati