Frage

Ich bin seit einigen Jahren von C ++ entfernt und erhalte einen Linker -Fehler aus dem folgenden Code:

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

Verwenden Sie Code :: Blöcke und GCC, wenn es für irgendjemanden wichtig ist. Auch eindeutig ein paar GA -Sachen auf C ++ zum Spaß und Üben portieren.

War es hilfreich?

Lösung

Die Vorlagendefinition (die CPP -Datei in Ihrem Code) muss vor dem Instanziieren einer bestimmten Vorlagenklasse aufgenommen werden. Sie müssen daher entweder Funktionsdefinitionen in den Header einbeziehen oder die CPP -Datei vor der Verwendung der Klasse (oder explizit tun Instanziationen, wenn Sie eine begrenzte Anzahl von ihnen haben).

Andere Tipps

Einschließlich der CPP -Datei mit den Implementierungen der Vorlagenklassenfunktionen funktioniert. IMHO, das ist seltsam und umständlich. Es muss sicherlich eine schickere Möglichkeit geben, dies zu tun?

Wenn Sie nur ein paar verschiedene Instanzen zum Erstellen und Kennen im Voraus haben, können Sie "explizite Instanziierung" verwenden, die Sie verwenden können.

Das funktioniert ungefähr so:

Oben auf Gene.cpp fügen Sie die folgenden Zeilen hinzu

template class Gene<int>;
template class Gene<float>;

Im if(value >= this->minValue && value <= this->minValue) der Zweite minValue sollte sein maxValue, nein?

Echo Was Sean sagte: Was ist die Fehlermeldung? Sie haben die Funktionen definiert und deklariert, aber Sie haben sie in irgendetwas nirgendwo verwendet, und ich sehe auch keinen Fehler (neben dem Tippfehler).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top