3

重複の可能性:
テンプレートを使用すると、「未解決の外部シンボル」エラーが発生するのはなぜですか?

常にエラーLNK2019があるのに、コードでテンプレートを使用しています。これが私のコードの一部です:

Method.h

template<typename type>
void Method(Model<type>* sys);

Method.cpp

template<typename type>
void Method(Model<type>* sys){ blablabla;}

Model.h

template<typename type>
class Model{ blablabla;}

class Model1:public Model<double>{ blablabla;}

Main.cpp

Model<double> *sys=new Model1();
Method(sys);

ただし、常にエラーLNK2019が表示されます。function_mainで参照されている未解決の外部シンボル「void__cdec1Method(classModel *)」。誰かが私がどこで間違っているのか知っていますか?どうもありがとう!

4

3 に答える 3

20

テンプレートはヘッダーに実装する必要があります。

Method.h

template<typename type>
void Method(Model<type>* sys){ /*Your code here*/ };

参照:https ://stackoverflow.com/a/495056/868546

マークランサムから:

.cppファイルでは、コンパイラは他のファイルで関数を使用するときにテンプレートパラメータがどうなるかを推測できないため、実際のコードは生成されません。リンカはコードの欠如に気づき、文句を言います。

通常の方法は、インライン関数と同様に、ヘッダーで関数本体全体を定義することです。これにより、コンパイラーは、テンプレートパラメーターが入力された状態で使用されている関数を確認したときにコードを出力できます。

于 2012-07-16T21:17:25.090 に答える
7

.cppファイルでは、コンパイラは他のファイルで関数を使用するときにテンプレートパラメータがどうなるかを推測できないため、実際のコードは生成されません。リンカはコードの欠如に気づき、文句を言います。

通常の方法は、インライン関数と同様に、ヘッダーで関数本体全体を定義することです。これにより、コンパイラーは、テンプレートパラメーターが入力された状態で使用されている関数を確認したときにコードを出力できます。

于 2012-07-16T21:18:38.260 に答える
0

テンプレートはヘッダーに実装する必要があります。そうでない場合は、テンプレート関数/クラスの明示的なインスタンス化を使用できます。

于 2012-07-16T21:21:01.593 に答える