20

数年間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++に明確に移植します。

4

3 に答える 3

28

テンプレート定義(コード内のcppファイル)は、特定のテンプレートクラスをインスタンス化する前に含める必要があるため、ヘッダーに関数定義を含めるか、クラスを使用する前にcppファイルを#includeする(または明示的に行う)必要があります。数が限られている場合のインスタンス化)。

于 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 に答える