Erro do vinculador de “símbolos indefinidos” com a classe de modelo simples
-
14-09-2019 - |
Pergunta
Estou longe de C ++ por alguns anos e estou recebendo um erro de vinculador do código a seguir:
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;
}
Usando o Code :: Blocks e o GCC se ele importa para alguém. Além disso, portando claramente algumas coisas do GA para C ++ para diversão e prática.
Solução
A definição de modelo (o arquivo CPP no seu código) deve ser incluído antes de instantar uma determinada classe de modelo, para que você precise incluir definições de função no cabeçalho ou #include o arquivo CPP antes de usar a classe (ou fazer explícito Instanciações se você tiver um número limitado deles).
Outras dicas
Incluindo o arquivo CPP que contém as implementações das funções de classe de modelo funciona. No entanto, IMHO, isso é estranho e estranho. Certamente deve haver uma maneira mais clara de fazer isso?
Se você tem apenas algumas instâncias diferentes para criar e conhecê -las de antemão, poderá usar "instanciação explícita"
Isso funciona algo assim:
No topo do gene.cpp, adicione as seguintes linhas
template class Gene<int>;
template class Gene<float>;
Dentro if(value >= this->minValue && value <= this->minValue)
o segundo minValue
deveria estar maxValue
, não?
Eco o que Sean disse: Qual é a mensagem de erro? Você definiu e declarou as funções, mas não as usou em nada em nenhum lugar, nem vejo um erro (além do erro de digitação).