単純なテンプレートクラスを使用した「未定義のシンボル」リンカーエラー

StackOverflow https://stackoverflow.com/questions/999358

質問

数年間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を使用して、誰にとっても重要な場合はGCCを使用します。また、楽しく練習するために、いくつかのGAのものをC ++に明らかに移植します。

役に立ちましたか?

解決

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

他のヒント

テンプレートクラス関数の実装を含むCPPファイルを含む機能が機能します。しかし、私見、これは奇妙で厄介です。確かにこれを行う滑りやすい方法がなければなりませんか?

作成するためのいくつかの異なるインスタンスしかなく、事前にそれらを知っている場合は、「明示的なインスタンス化」を使用できます。

これは次のように機能します:

gene.cppの上部に次の行を追加します

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

if(value >= this->minValue && value <= this->minValue) 二番目 minValue あるべきです maxValue, 、 番号?

エコーショーンが言ったこと:エラーメッセージは何ですか?関数を定義して宣言しましたが、どこにも何も使用していませんし、エラーも表示されません(タイプミス以外)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top