C プログラミングでは、テンプレート クラスは、さまざまな型でインスタンス化できる汎用機能を提供するためによく使用されます。ただし、テンプレート クラスをインスタンス化するときに、「未定義の参照への参照」エラーが発生することがあります。
このエラーは、コンパイラがテンプレート クラスのコンストラクターの実装を見つけられない場合に発生します。通常、コンパイラーは、インスタンス化されたクラスのコードを生成するために、コンストラクターの実装を確認する必要があります。
提供されたコードでは、テンプレート クラス cola が cola.h で定義されています。ヘッダー ファイルですが、実装は cola.cpp ファイルにあります。プログラムをコンパイルするとき、コンパイラーは main.cpp 内のテンプレート宣言を確認し、float 型と string 型を使用して cola クラスを暗黙的にインスタンス化しようとします。
ただし、コンパイラーは、main.cpp 内のコンストラクターの実装をまだ確認していないため、 cola.cpp では、これらのインスタンス化されたクラスのコードを生成できず、「未定義の参照」が発生します。エラー。
この問題を解決するには 2 つのアプローチがあります。
最後に明示的なテンプレートのインスタンス化を追加します。 cola.cpp ファイル:
template class cola<float>; template class cola<string>;
これは明示的にコンパイラを使用して、指定された型の cola テンプレート クラスのコードを生成します。
テンプレート クラスのコンストラクターとメンバー関数の実装をヘッダー ファイルに移動します ( cola.h および nodo_colaypila.h).
これにより、コンパイラーが実装を認識することが保証されます。テンプレート クラスをインスタンス化し、明示的なインスタンス化の必要性を排除します。
アプローチ 1 では、明示的なインスタンス化は翻訳単位 (単一のコンパイル済みファイル) の最後に行われます。 。これは、そのファイル内のすべてのコードはインスタンス化の前にコンパイルする必要があることを意味します。
アプローチ 2 では、実装はヘッダー ファイル内にあり、テンプレート クラスを使用するすべての翻訳単位に含まれます。その結果、コンパイルの順序に関係なく、コンパイラは実装を利用できるようになります。
どちらのアプローチも、テンプレート クラスの「未定義の参照」エラーに対する有効な解決策です。どちらを選択するかは、プロジェクトの具体的なニーズによって異なります。明示的なインスタンス化はより柔軟であり、どのテンプレートの特殊化を生成するかをより適切に制御できます。ただし、実装をヘッダー ファイルに移動する方が一般的であり、テンプレート クラスをより柔軟に使用できます。
以上がC のテンプレート クラス コンストラクターで「未定義の参照への参照」エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。