[解決済み] テンプレートを使用すると、"unresolved external symbol" エラーが発生するのはなぜですか?重複
2022-11-04 21:42:50
質問
テンプレートを使用してクラスの C++ コードを書き、コードをソース (CPP) ファイルとヘッダー (H) ファイルに分割すると、オブジェクト ファイルが正しくビルドされてリンクに含まれているにもかかわらず、最終実行ファイルをリンクする際に多くの "unresolved external symbol" エラーを受け取ります。 ここで何が起こっているのでしょうか、そしてどのようにそれを修正すればよいのでしょうか。
どのように解決するのですか。
テンプレート化されたクラスと関数は、使用されるまでインスタンス化されず、通常は別の .cpp ファイル (プログラム ソースなど) で使用されます。 テンプレートが使用されるとき、コンパイラーは、適切な型を持つ正しい関数を構築できるようにするために、その関数の完全なコードを必要とします。 しかし、この場合、その関数のコードはテンプレートのソースファイルに詳細に記述されているため、利用することができません。
この結果、コンパイラはそれが別の場所で定義されているとみなし、テンプレート化された関数への呼び出しだけを挿入します。 テンプレートのソース ファイルをコンパイルするとき、プログラム ソースで使用されている特定のテンプレート タイプはそこで使用されていないため、関数のために必要なコードはまだ生成されません。 この結果、未解決の外部シンボルが発生します。
これに対して利用可能な解決策は、次のとおりです。
- の完全な定義を含める。 メンバ関数の完全な定義を テンプレートのヘッダファイルにメンバ関数の完全な定義を含め、テンプレートのソースファイルを持たない テンプレート用のソースファイルを持たないようにします。
-
(更新:[Visual Studio 2017+では動作しません])、または -
(更新 は、C++11 で標準から削除されました。 .)
1と2の両方は、基本的にコンパイラがプログラムソースで型付けされた関数を構築しようとするときに、テンプレート化された関数のフルコードへのアクセスを与えることで問題に対処しています。
関連
-
[解決済み】 unsigned int vs. size_t
-
[解決済み] テスト
-
[解決済み】coutはstdのメンバではない
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み] LNK2019: unresolved external symbol - function というエラーはどうすれば解決できますか?
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] 未解決の外部シンボル __imp__fprintf および __imp____iob_func, SDL2
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】'cout'は型名ではない
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?