2009-06-16 9 views
13

estado lejos de C++ para unos años y estoy recibiendo un error de enlazador desde el siguiente código:símbolos "indefinido" error de vinculador con una simple clase de plantilla

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 Code :: Blocks y GCC si le importa a alguien. Además, claramente transfiere algunas cosas de GA a C++ para diversión y práctica.

+0

mensajes de error exacto sería útil. –

+2

posible duplicado de [¿Por qué sólo puede ser implementado plantillas en el archivo de cabecera?] (Http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file) –

Respuesta

21

La definición de plantilla (el archivo cpp en su código) debe incluirse antes de crear una clase de plantilla determinada, por lo que debe incluir definiciones de funciones en el encabezado o #incluir el archivo cpp antes de usar la clase (o realice instancias explícitas si tiene un número limitado de ellas).

+0

Gracias! Debo haber aprendido eso en un punto. Tal vez ahora se pegue: D –

+2

O simplemente implemente toda la plantilla en el archivo de encabezado. Ver la pregunta relacionada [¿Por qué sólo plantillas pueden ser implementados en el archivo de cabecera?] (Http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file) – ecerulm

2

incluir el archivo de CPP que contiene las implementaciones de las obras funciones de clase plantilla. Sin embargo, en mi humilde opinión, esto es extraño e incómodo. Seguramente debe haber una forma más suave de hacer esto?

Si usted tiene sólo unos pocos casos diferentes para crear y sabe de antemano, a continuación, puede utilizar "instanciación explícita"

Esto funciona así:

En la parte superior del complemento gene.cpp las siguientes líneas

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

En la segunda if(value >= this->minValue && value <= this->minValue)minValue deben ser maxValue, ¿no?

Echo lo que Sean dijo: ¿Cuál es el mensaje de error? Ha definido y declarado las funciones, pero no las ha utilizado en ningún lugar, ni veo un error (además del error tipográfico).

Cuestiones relacionadas