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.

È stato utile?

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top