避けられないピット--ヘッダファイルは互いに含まれる(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ファイルは以下の通りです.
#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でヘッダファイルを繰り返し含む穴を避けましたが、私たちも勝手に含めることはできません.お互いを含むことを避ける必要があります!!!