20

离开 C++ 几年了,我从以下代码中得到一个链接器错误:

基因.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

基因.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++ 中。

4

3 回答 3

28

必须在实例化给定模板类之前包含模板定义(代码中的 cpp 文件),因此您必须在标头中包含函数定义,或者在使用该类之前#include cpp 文件(或显式如果您的实例数量有限,则实例化)。

于 2009-06-16T02:40:16.540 回答
5

包含包含模板类函数实现的 cpp 文件是可行的。但是,恕我直言,这很奇怪而且很尴尬。一定有一种更巧妙的方式来做到这一点?

如果您只有几个不同的实例要创建,并且事先知道它们,那么您可以使用“显式实例化”

这工作是这样的:

在gene.cpp 的顶部添加以下行

template class Gene<int>;
template class Gene<float>;
于 2009-09-11T14:39:48.300 回答
1

if(value >= this->minValue && value <= this->minValue)第二个minValue应该是maxValue,不是吗?

回应肖恩所说的:错误信息是什么?您已经定义并声明了这些函数,但是您没有在任何地方使用它们,我也没有看到错误(除了错字)。

于 2011-10-31T13:20:20.053 回答