errore del linker “simboli non definiti” con la semplice classe template
-
14-09-2019 - |
Domanda
Conosci lontano da C ++ per alcuni anni e sto ottenendo un errore di linker dal seguente codice:
Gene.h
#ifndef GENE_H_INCLUDED
#define GENE_H_INCLUDED
template <typename T>
class Gene {
public:
T getValue();
void setValue(T value);
void setRange(T min, T max);
private:
T value;
T minValue;
T maxValue;
};
#endif // GENE_H_INCLUDED
Gene.cpp
#include "Gene.h"
template <typename T>
T Gene<T>::getValue() {
return this->value;
}
template <typename T>
void Gene<T>::setValue(T value) {
if(value >= this->minValue && value <= this->minValue) {
this->value = value;
}
}
template <typename T>
void Gene<T>::setRange(T min, T max) {
this->minValue = min;
this->maxValue = max;
}
Utilizzando Code :: Blocks e GCC se è importante per chiunque. Inoltre, chiaramente porting alcune cose GA a C ++ per il divertimento e la pratica.
Soluzione
La definizione del modello (il file cpp nel codice) deve essere incluso prima di istanziare una data classe template, in modo che sia necessario includere definizioni di funzioni nell'intestazione, o # include il file cpp prima di utilizzare la classe ( o fare istanze esplicite se si dispone di un numero limitato di essi).
Altri suggerimenti
Tra cui il file cpp contenente le implementazioni delle opere funzioni di classe modello. Tuttavia, secondo me, questo è strano e scomodo. Ci deve essere sicuramente un modo trasandato di fare questo?
Se avete solo pochi casi diversi per creare, e li conosce in anticipo, quindi è possibile utilizzare "istanziazione esplicita"
Questo funziona in questo modo:
In cima gene.cpp aggiungere le seguenti righe
template class Gene<int>;
template class Gene<float>;
Nella if(value >= this->minValue && value <= this->minValue)
seconda minValue
dovrebbe essere maxValue
, no?
Echo quello che ha detto Sean: Qual è il messaggio di errore? Aver definito e dichiarato le funzioni, ma non li hai utilizzato in nulla da nessuna parte, né mi visualizzato un errore (oltre l'errore di battitura).