Ошибка компоновщика “Неопределенные символы” с простым шаблонным классом
-
14-09-2019 - |
Вопрос
Был далек от 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
, нет?
Повтори то, что сказал Шон:Что это за сообщение об ошибке?Вы определили и объявили функции, но вы нигде их ни в чем не использовали, и я не вижу ошибки (кроме опечатки).