Ошибка компоновщика “Неопределенные символы” с простым шаблонным классом

StackOverflow https://stackoverflow.com/questions/999358

Вопрос

Был далек от C ++ в течение нескольких лет и получаю ошибку компоновщика из следующего кода:

Ген.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;
}

Используя Code::Blocks и GCC, если это имеет значение для кого-либо.Кроме того, явно портирую некоторые материалы GA на C ++ для развлечения и практики.

Это было полезно?

Решение

Определение шаблона (cpp-файл в вашем коде) должно быть включено до создания экземпляра данного шаблонного класса, поэтому вам либо нужно включить определения функций в заголовок, либо #включить cpp-файл перед использованием класса (или выполнить явные создания экземпляров, если у вас их ограниченное количество).

Другие советы

Включение файла cpp, содержащего реализации функций шаблонного класса, работает.Однако, ИМХО, это странно и неловко.Наверняка должен быть более плавный способ сделать это?

Если у вас есть только несколько разных экземпляров для создания, и вы знаете их заранее, то вы можете использовать "явное создание экземпляра".

Это работает примерно так:

В верхней части gene.cpp добавьте следующие строки

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

В if(value >= this->minValue && value <= this->minValue) второй minValue должно быть maxValue, нет?

Повтори то, что сказал Шон:Что это за сообщение об ошибке?Вы определили и объявили функции, но вы нигде их ни в чем не использовали, и я не вижу ошибки (кроме опечатки).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top