単純なテンプレートクラスを使用した「未定義のシンボル」リンカーエラー
-
14-09-2019 - |
質問
数年間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
, 、 番号?
エコーショーンが言ったこと:エラーメッセージは何ですか?関数を定義して宣言しましたが、どこにも何も使用していませんし、エラーも表示されません(タイプミス以外)。
所属していません StackOverflow