离开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 ++中以获得乐趣和练习。
答案 0 :(得分:22)
在实例化给定模板类之前,必须包含模板定义(代码中的cpp文件),因此您必须在标头中包含函数定义,或者在使用类之前#include cpp文件(或者如果您的数量有限,则进行显式实例化。)
答案 1 :(得分:3)
包含包含模板类函数实现的cpp文件。然而,恕我直言,这是奇怪和尴尬。一定有一种更明智的方式吗?
如果您只想创建几个不同的实例,并事先了解它们,那么您可以使用“显式实例化”
这可以这样:
在gene.cpp的顶部添加以下行
template class Gene<int>;
template class Gene<float>;
答案 2 :(得分:1)
在if(value >= this->minValue && value <= this->minValue)
中,第二个minValue
应为maxValue
,不是吗?
回应肖恩所说的:错误信息是什么?你已经定义并声明了这些函数,但你没有在任何地方使用它们,也没有看到错误(除了拼写错误)。