[解決済み] エラー - 不完全な型の無効な使用 / の前方宣言
2022-02-01 15:29:27
質問
私の問題はかなり一般的だと思いますが、検索して見つけたあらゆる解決策を試しましたが、まだうまくいきません。だから、任意のヘルプは非常に高く評価されるでしょう =)
ありがとうございました。
コンパイル時にこのエラーが発生しました。
g++ -ISFML/include -Iclasses/ -W -Wall -Werror -c -o classes/Object.o classes/Object.cpp
In file included from classes/Core.hh:18:0,
from classes/Object.hh:4,
from classes/Object.cpp:1:
classes/MapLink.hh:9:1: error: invalid use of incomplete type ‘struct Object’
classes/MapLink.hh:6:7: error: forward declaration of ‘struct Object’
In file included from classes/Core.hh:19:0,
from classes/Object.hh:4,
from classes/Object.cpp:1:
classes/Player.hh:9:1: error: invalid use of incomplete type ‘struct Object’
classes/MapLink.hh:6:7: error: forward declaration of ‘struct Object’
make: *** [classes/Object.o] Error 1
だから基本的には、メインを含む(main.cpp)
#include "Core.hh"
int main(void)
{
...
}
以下は、私のすべてのインクルードを含むヘッダーファイル(Core.hh)です。
#ifndef __CORE_HH__
# define __CORE_HH__
#include ...
#include "Object.hh"
#include "MapLink.hh"
#include "Player.hh"
class Core
{
...
};
#endif /* __CORE_HH__ */
そして、問題のあるファイル(Object.hh)。
#ifndef __OBJECT_HH__
# define __OBJECT_HH__
#include "Core.hh"
class Object
{
...
};
#endif /* __OBJECT_HH__ */
(MapLink.hh)
#ifndef __MAPLINK_H__
# define __MAPLINK_H__
#include "Core.hh"
class Object;
class MapLink : public Object
{
...
};
#endif /* __MAPLINK_H__ */
(プレイヤー.hh)
#ifndef __PLAYER_H__
# define __PLAYER_H__
#include "Core.hh"
class Object;
class Player : public Object
{
...
};
#endif /* __PLAYER_H__ */
解決方法は?
問題点その1。
完全に宣言されたクラスからのみ派生させなければならない。そうでなければ、コンパイラは何をしたらよいかわからない。
前方宣言を削除する
class Object;
.
問題点その2。
循環型依存関係があちこちで発生していますね。
- Core.hhの中に、Object.hh、MapLink.hh、Player.hhが含まれています。
- Object.hh、MapLink.hh、Player.hhでは、Core.hhをインクルードしています。
各クラスが、継承するクラスを完全に含んでいることを確認する必要があります。
クラスがどのように相互作用しているのかよくわからないので、その詳細を質問で教えてください。
私の推測では、以下のようにインクルードを修正する必要があると思います。
- MapLink.hh" と PlayerLink.hh" が "Core.hh" ではなく "Object.hh" を含むように修正します。
- Object.hh" が "Core.hh" を含まないように修正します。
関連
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】C++の余分な資格エラー
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] フォワード宣言はどのような場合に使用できますか?
-
[解決済み】静的定数文字列(クラスメンバ)
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み] C++の識別子でアンダースコアを使用する場合のルールについて教えてください。