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.

Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top