エラー: 'xxx' は事前宣言と C++ ヘッダーファイルが互いに含まれているため、型名になりません。
2022-02-08 10:26:50
ソースファイル内でクラスへのポインタを宣言または定義するには、そのクラスを使用する前に宣言または定義する必要があるため、以下のコードではエラーが報告されるでしょう。
class A
{
public:
B *b;
};
class B
{
public:
A *a;
};
int main()
{
return 0;
}
エラー "error: 'B' does not name a type" は、クラス A で B *b を使う前にクラス B が宣言または定義されていないためです。
また、ヘッダー同士が含まれる場合にも "error: 'xxx' does not name a type" が発生しますが、理由は上記のコードと同じなので、以下のコードを参照してください。
a.h.
#ifndef A_H_INCLUDED
#define A_H_INCLUDED
#include "b.h"
class A
{
public:
B *b;
};
#endif // A_H_INCLUDED
b.h.
#ifndef B_H_INCLUDED
#define B_H_INCLUDED
#include "a.h"
class B
{
public:
A *a;
};
#endif // B_H_INCLUDED
main.cppです。
#include "a.h"
#include "b.h"
int main()
{
return 0;
}
コンパイラは次のようなエラーを報告します: "error: 'A' does not name a type" なぜでしょうか?それでは、"gcc -E -o a.i a.h" というコマンドで前処理をした後に a.h がどのように展開されるかを見てみましょう。
# 1 "a.h"
# 1 "
Ignoring the line starting with "#", we see that it is now almost identical to the opening source file, except that the class order has been swapped, so the cause of the error is the same as the opening source file.
The solution is also very simple, replace "#include "b.h"" in a.h with the predeclaration "class B;" in class B, and make a similar change in b.h. Make a similar change in b.h. In this case, it will not cause problems. Of course, there is a prerequisite for this: the only members in class A are pointers to class B, not variables of class B, and no members or functions of class B can be accessed in the class A header file. In either case, class A needs to know the size or other details of class B. The predecessor declaration cannot provide these details, and a problem like "error: field 'b' has incomplete type 'B '".
Ignoring the line starting with "#", we see that it is now almost identical to the opening source file, except that the class order has been swapped, so the cause of the error is the same as the opening source file.
The solution is also very simple, replace "#include "b.h"" in a.h with the predeclaration "class B;" in class B, and make a similar change in b.h. Make a similar change in b.h. In this case, it will not cause problems. Of course, there is a prerequisite for this: the only members in class A are pointers to class B, not variables of class B, and no members or functions of class B can be accessed in the class A header file. In either case, class A needs to know the size or other details of class B. The predecessor declaration cannot provide these details, and a problem like "error: field 'b' has incomplete type 'B '".
関連
-
std::logic_error' のインスタンスを投げた後に呼び出された実行エラー終了 what(): basic_string::_S_const
-
警告 - 符号付き整数式と符号なし整数式の比較 [-Wsign-compare] 解決方法
-
const char*' から 'char*' への変換が無効です。
-
C++: エラー C2228: '.str' の左側にはクラス/構造体/結合が必要
-
C/C++ におけるランダム関数 rand() および srand() の使用法
-
stoi' の解決策は、Dev-c++ のこのスコープで宣言されていません。
-
EclipseのC++コードでシンボル'std'が解決できない問題の解決
-
C++ shared_ptr コンパイルエラー 'shared_ptr' がこのスコープで宣言されていない問題を修正しました。
-
ベクトル添え字が範囲外のコンテナの使用、その他類似のエラー
-
デバッグエラー Assertion Failed 問題について
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
c++ エラー: 'map' は型名ではありません。
-
エラー: ローカル変数 'res' に関連付けられたスタックメモリのアドレスが返された
-
C++のコンパイルエラーで修飾子が破棄される [-fpermissive] 。
-
C++ [エラー] 'std::string {aka std::basic_string<char>}' を 'char*' に変換できないエラー
-
非静的メンバ関数の無効な使用
-
c++ experience summary(1):linux c compile with warning: assign makes pointer from integer without cast reason.
-
C++プロジェクトのコンパイル時に再定義の多重定義問題を解決する
-
C++ Error no matching function for call to 'std::basic_ofstream<char>::basic_ofstream(std::string&)
-
C++ ダイナミックオープンスペース
-
C++によるhttpサーバー/webサーバーの作成