2

私が作成して使用するすべてのテンプレート化されたクラス/メソッド/関数に対して明示的なテンプレートのインスタンス化を含めない限り、私のC++プロジェクトのいずれかがリンカーエラーを生成します。

STLクラスにはそのような問題はないようです。

STLのような遅延インスタンス化を可能にする、遵守できる簡単な行動規範(しゃれを意図したもの)はありますか?

聞いてくれてありがとう。

4

3 に答える 3

8

テンプレートの場合、すべてのテンプレートコードとメソッドをソースファイルではなくヘッダーに配置する必要があります。標準ライブラリはこれを行います。

于 2011-09-30T19:03:03.547 に答える
1

テンプレートのほとんどの部分は、ヘッダー ファイル内に配置する必要があります。これは、テンプレート クラスだけでなく、通常のクラス内のテンプレート関数にも等しく適用されます。

このルールの例外として、テンプレートを特殊化する場合、特殊化は具象型であるため、その特殊化を implementation/.cpp ファイルに配置する必要があります。一方、実際のテンプレート定義は、テンプレートで使用されるテンプレート パラメータ タイプごとに 1 つずつ、複数回実行する必要があります。

例:

template typename<T> foo(T val) { std::cerr << "DEFAULT"; }

ヘッダー ファイルとその int への特殊化:

template<> foo<int>(int val) { std::cerr << "INT"; }

int バージョンは具体的な完全に定義された関数であるのに対し、T バージョンはテンプレート定義であり、多くの具体的な関数を生成するために何度も使用されるためです。

于 2011-09-30T19:24:58.163 に答える
1

ほとんどの場合、テンプレート クラスはヘッダー ファイルで完全に定義されます。これにより、使用している関数とテンプレート パラメーターの組み合わせがまだ見つかっていない場合、コンパイラーはその場でコードの本体を生成できます。

別個のヘッダー ファイルと実装ファイルを含むテンプレートを引き続き使用できますが、あまり便利ではありません。お気づきのように、コンパイラが必要なコードを生成できるように、各テンプレート パラメーターを予測し、その組み合わせを実装ファイルに配置する必要があります。

于 2011-09-30T19:33:51.803 に答える