避けられないピット--ヘッダファイルは互いに含まれる(Compiler error C 2653:not a class or namespace name)
最近自分で穴をあけられて、他の人のコードを変えて、最後にコンパイラはこのように間違っています:
error C2653: not a class or namespace name
簡単に説明します:1つのクラスAがあって、宣言と実現はそれぞれa.hとa.ccの中で1つのクラスBに位置して、宣言と実現はそれぞれb.hとb.ccの中でクラスAのあるメンバー関数に位置してBクラスタイプをパラメータクラスBのあるメンバー関数として必要としてAクラスタイプをパラメータとして必要とします
a.hファイルは以下の通りです.
a.ccファイル省略、影響なし
b.hファイルは次のとおりです.
このとき、コンパイラはエラーを報告します:error C 2653:A not a class or namespace name
このとき、私たちの最初の反応は、b.hにAクラスが存在するヘッダファイルが含まれているかどうか、すなわちa.hファイルが含まれているかどうかを確認することです.
しかし、お父さんのことは、私たちは含まれているのに、どうして間違っているのですか.
はい、お互いに含まれていることです.コンパイラはもう覆われています.簡単に言えば、不要なヘッダファイルを含まないでください.
どうやって修正したか教えてくれるのを忘れるところだった.
まず,クラスAとBをネーミング空間に配置し,AとBをnamespace KENG{}パッケージ化した.
この場合、AにBのヘッダファイルを含まないで、前置き宣言、、、、、
大成功!私たちは#ifndefでヘッダファイルを繰り返し含む穴を避けましたが、私たちも勝手に含めることはできません.お互いを含むことを避ける必要があります!!!
error C2653: not a class or namespace name
簡単に説明します:1つのクラスAがあって、宣言と実現はそれぞれa.hとa.ccの中で1つのクラスBに位置して、宣言と実現はそれぞれb.hとb.ccの中でクラスAのあるメンバー関数に位置してBクラスタイプをパラメータクラスBのあるメンバー関数として必要としてAクラスタイプをパラメータとして必要とします
a.hファイルは以下の通りです.
#ifndef A_H_
#define A_H_
#include "b.h"
class A
{
public:
enum State
{
RIGHT = 0;
ERROR = 1;
}
void send (B b);
...
};
#endif
a.ccファイル省略、影響なし
b.hファイルは次のとおりです.
#ifndef B_H_
#define B_H_
#include "a.h"
class B
{
public:
void send (A::State state);
...
};
このとき、コンパイラはエラーを報告します:error C 2653:A not a class or namespace name
このとき、私たちの最初の反応は、b.hにAクラスが存在するヘッダファイルが含まれているかどうか、すなわちa.hファイルが含まれているかどうかを確認することです.
しかし、お父さんのことは、私たちは含まれているのに、どうして間違っているのですか.
はい、お互いに含まれていることです.コンパイラはもう覆われています.簡単に言えば、不要なヘッダファイルを含まないでください.
どうやって修正したか教えてくれるのを忘れるところだった.
まず,クラスAとBをネーミング空間に配置し,AとBをnamespace KENG{}パッケージ化した.
この場合、AにBのヘッダファイルを含まないで、前置き宣言、、、、、
#ifndef A_H_
#define A_H_
class B;
class A
{
public:
enum State
{
RIGHT = 0;
ERROR = 1;
}
void send (B b);
...
};
#endif
大成功!私たちは#ifndefでヘッダファイルを繰り返し含む穴を避けましたが、私たちも勝手に含めることはできません.お互いを含むことを避ける必要があります!!!