由于循环依赖,C ++类型名称未知

时间:2018-12-03 02:22:24

标签: c++ include circular-dependency

C ++新手在这里。我目前有两个相互依赖的类。类别A构成类别B的数据成员,而类别B使用指向类别A的指针。

// main.cpp 
#include "A.hpp"

// A.hpp
#pragma once
#include "B.hpp"

class A {
    private:
        const B obj;
};


// B.hpp
#pragma once
#include "A.hpp"

// forward declaration
class A;
using T = A;

class B {
    private:
        T* t_obj;
};

我的理解是,预处理器将首先输入A.hpp,然后立即输入B.hpp。由于A.hpp,它将无法再次输入#pragma once,并且将以B.hpp继续。然后它将到达前向声明,因此class B应该没问题。然后,A.hpp将恢复,并且class A应该没问题。

但是,我得到的编译错误是这样的:

 ./A.hpp:5: error: unknown type name 'B'
        const B obj;

任何见识将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

main.cpp应该可以自己解释一下。但是,您在评论中提到自己有B.cpp !?我的猜测是您引用的错误实际上是在B.cpp而不是main.cpp的编译期间发生的。如果B.cpp包含B.h,则预处理器将包含B.h,后者将包含A.h。并且A.h将尝试包含B.h,但是由于此时已经包含了B.h,因此编译器将跳过由于#pragma once而导致的包含,并且您输入了class A却没有看到class B的定义…