c ++通过复杂的依赖关系获得正确的前向声明

c++ Getting forward declaration correct with complex dependencies

问题

我收到以下编译错误:

error: member access into incomplete type 'IRB'

这发生在使用 class IRB 的第一行,在 HG.h

问题

Header 个文件

T.h

typedef IRBBase__<true, true> IRB_BASE;  // typedef a template instantiation

IRB.h

#include "T.h"
#include "FH.h"
class FH; // FWD DCLR
class IRB : IRB_BASE {..};

FH.h

#include "T.h"
#include "IRB.h"
#include "HG.h"
class IRB;  // FWD DCLR
class HG;   // FWD DCLR
class FH {..};

HG.h

#include "T.h"
#include "FH.h"
#include "IRB.h"
#include "CU.h"
class FH;   // FWD DCLR
class IRB;  // FWD DCLR
class CU;   // FWD DCLR
class HG {..};

CU.h

#include "T.h"
#include "IRB.h"
#include "FH.h"
class IRB;
class FH;
class CU {..};

编辑:成功了

user0042 建议之后,我通过将 headers 从除 HG.h 之外的所有文件移动到它们各自的 .cc 文件中来使其工作。 在 HG.h 中,我保留了前向声明和 header 文件。

此答案基于我收到的评论。

header 文件中的函数声明可能使用了我们不想包含的 class,但这可能会导致循环依赖。

所以解决方案是:

  • 将我们在header文件中提到的classes的#include移动到源文件
  • 在 header 文件中执行 class
  • forward declaration

可以对 header 中 未使用 的任何 class 执行此操作。如果我们使用 header,如以下示例 HG.h,我们应该将 #include 保留在 header 文件中。

问题示例的解决方案

T.h

typedef IRBBase__<true, true> IRB_BASE;  // typedef a template instantiation

IRB.h

class FH; // FWD DCLR
class IRB : IRB_BASE {..};

FH.h

class IRB;  // FWD DCLR
class HG;   // FWD DCLR
class FH {..};

HG.h

#include "T.h"
#include "FH.h"
#include "IRB.h"
#include "CU.h"
class FH;   // FWD DCLR
class IRB;  // FWD DCLR
class CU;   // FWD DCLR
class HG {..
   // some of the classes are used here, because some functions
   // were too small and kept them in the header file (defined the function)
   // if the same had happened with another of the headers, causing a
   // cyclic include dependency, then I should have converted
   // some of the function definitions into declarations, and move the
   // implementation of the file in the source file (.cc)
};

CU.h

class IRB;
class FH;
class CU {..};