1. ホーム
  2. c++

[解決済み] テンプレートを使用すると、"unresolved external symbol" エラーが発生するのはなぜですか?重複

2022-11-04 21:42:50

質問

テンプレートを使用してクラスの C++ コードを書き、コードをソース (CPP) ファイルとヘッダー (H) ファイルに分割すると、オブジェクト ファイルが正しくビルドされてリンクに含まれているにもかかわらず、最終実行ファイルをリンクする際に多くの "unresolved external symbol" エラーを受け取ります。 ここで何が起こっているのでしょうか、そしてどのようにそれを修正すればよいのでしょうか。

どのように解決するのですか。

テンプレート化されたクラスと関数は、使用されるまでインスタンス化されず、通常は別の .cpp ファイル (プログラム ソースなど) で使用されます。 テンプレートが使用されるとき、コンパイラーは、適切な型を持つ正しい関数を構築できるようにするために、その関数の完全なコードを必要とします。 しかし、この場合、その関数のコードはテンプレートのソースファイルに詳細に記述されているため、利用することができません。

この結果、コンパイラはそれが別の場所で定義されているとみなし、テンプレート化された関数への呼び出しだけを挿入します。 テンプレートのソース ファイルをコンパイルするとき、プログラム ソースで使用されている特定のテンプレート タイプはそこで使用されていないため、関数のために必要なコードはまだ生成されません。 この結果、未解決の外部シンボルが発生します。

これに対して利用可能な解決策は、次のとおりです。

  1. の完全な定義を含める。 メンバ関数の完全な定義を テンプレートのヘッダファイルにメンバ関数の完全な定義を含め、テンプレートのソースファイルを持たない テンプレート用のソースファイルを持たないようにします。
  2. (更新:[Visual Studio 2017+では動作しません])、または
  3. (更新 は、C++11 で標準から削除されました。 .)

1と2の両方は、基本的にコンパイラがプログラムソースで型付けされた関数を構築しようとするときに、テンプレート化された関数のフルコードへのアクセスを与えることで問題に対処しています。