Ошибка компоновщика «неопределенные символы» с простым классом шаблона - PullRequest
14 голосов
/ 16 июня 2009

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

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

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

Ответы [ 3 ]

22 голосов
/ 16 июня 2009

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

3 голосов
/ 11 сентября 2009

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

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

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

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

template class Gene<int>;
template class Gene<float>;
1 голос
/ 31 октября 2011

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

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

...