2009-06-16 14 views
13

数年間離れて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

正確なエラーメッセージが役立ちます。 –

+2

[テンプレートはヘッダーファイルにのみ実装できますか?](http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file) –

答えて

21

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

+0

ありがとう!私はそれをある時点で知ったにちがいない。たぶんそれは固執するでしょう:D –

+2

または、テンプレート全体をヘッダーファイルに実装するだけです。関連する質問[なぜテンプレートはヘッダーファイルにのみ実装できますか?](http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file)を参照してください。 – ecerulm

2

テンプレートクラス関数の実装を含むcppファイルが含まれます。しかし、IMHO、これは奇妙で厄介です。確かにこれを行うのにぴったりの方法が必要ですか?

作成するだけで、いくつかの異なるインスタンスを持っている、と事前にそれらを知っているならば、あなたは

を「明示的なインスタンスを」使用することができます。これは、このようなものに動作します:gene.cpp ADDの上部に

if(value >= this->minValue && value <= this->minValue)minValue

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

次の行ではありません、maxValueすべきですか?

Seanが言ったことをエコー:エラーメッセージは何ですか?関数を定義して宣言しましたが、あなたはどこでもそれらを使用していませんし、エラーも表示されていません。

関連する問題