私が作成して使用するすべてのテンプレート化されたクラス/メソッド/関数に対して明示的なテンプレートのインスタンス化を含めない限り、私のC++プロジェクトのいずれかがリンカーエラーを生成します。
STLクラスにはそのような問題はないようです。
STLのような遅延インスタンス化を可能にする、遵守できる簡単な行動規範(しゃれを意図したもの)はありますか?
聞いてくれてありがとう。
私が作成して使用するすべてのテンプレート化されたクラス/メソッド/関数に対して明示的なテンプレートのインスタンス化を含めない限り、私のC++プロジェクトのいずれかがリンカーエラーを生成します。
STLクラスにはそのような問題はないようです。
STLのような遅延インスタンス化を可能にする、遵守できる簡単な行動規範(しゃれを意図したもの)はありますか?
聞いてくれてありがとう。
テンプレートの場合、すべてのテンプレートコードとメソッドをソースファイルではなくヘッダーに配置する必要があります。標準ライブラリはこれを行います。
テンプレートのほとんどの部分は、ヘッダー ファイル内に配置する必要があります。これは、テンプレート クラスだけでなく、通常のクラス内のテンプレート関数にも等しく適用されます。
このルールの例外として、テンプレートを特殊化する場合、特殊化は具象型であるため、その特殊化を implementation/.cpp ファイルに配置する必要があります。一方、実際のテンプレート定義は、テンプレートで使用されるテンプレート パラメータ タイプごとに 1 つずつ、複数回実行する必要があります。
例:
template typename<T> foo(T val) { std::cerr << "DEFAULT"; }
ヘッダー ファイルとその int への特殊化:
template<> foo<int>(int val) { std::cerr << "INT"; }
int バージョンは具体的な完全に定義された関数であるのに対し、T バージョンはテンプレート定義であり、多くの具体的な関数を生成するために何度も使用されるためです。
ほとんどの場合、テンプレート クラスはヘッダー ファイルで完全に定義されます。これにより、使用している関数とテンプレート パラメーターの組み合わせがまだ見つかっていない場合、コンパイラーはその場でコードの本体を生成できます。
別個のヘッダー ファイルと実装ファイルを含むテンプレートを引き続き使用できますが、あまり便利ではありません。お気づきのように、コンパイラが必要なコードを生成できるように、各テンプレート パラメーターを予測し、その組み合わせを実装ファイルに配置する必要があります。