代码之家  ›  专栏  ›  技术社区  ›  klaus

由于类类型的转换错误,无法通过此操作

  •  3
  • klaus  · 技术社区  · 7 年前

    我在两个不同的文件中定义了以下两个类:

    #include "B.h"
    class A {
     public:
      A() {}
      ~A() {}
      f() {
       auto b = new B(this);
      }
    };
    

    在另一个文件中:

    #include "A.h"
    class B {
     public:
      B(A* a) {}
      ~B() {}
    }
    

    但我不明白我得到的编译错误:

    B.h: error: ‘A’ has not been declared
    A.cpp: error: no matching function for call to ‘B(A&)‘
                                                          *this);
                  note: candidate is:
                  note: B(int*)
                  note: no known conversion for argument 1 from ‘A’ to ‘int*’
    

    为什么我的A类被转换成int?!

    2 回复  |  直到 7 年前
        1
  •  6
  •   songyuanyao    7 年前

    这是一个社区依赖性问题。 B.h 包括 A.h A.h 包括 B.h .

    事实上,你不需要 #include "A.h" 在里面 B.h , A 不需要 complete type 此处(即将其用作函数声明中的参数类型), forward declaration 这就足够了。

    class A;  // forward declaration
    
    class B {
     public:
      B(A* a) {}
      ~B() {}
    };
    
        2
  •  3
  •   lubgr    7 年前

    这里有一个循环依赖关系。定义 class A 不能依赖于 class B ,如果后者取决于前者的定义。你可以通过改变其中一个 #include 将指令转化为向前的声明。就你而言,

    // Don't include the complete definition
    // #include "A.h"
    
    class A; // Instead: forward-declare A
    
    class B {
      public:
       B(A* a) {}
      ~B() {}
    };
    

    你可能需要定义 A 在您的实现文件中。但这很好,你可以 #include "A.h" 在一个翻译单元中,不会回到循环依赖性问题。