C ++ неизвестное имя типа из-за циклической зависимости - PullRequest
0 голосов
/ 03 декабря 2018

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 голосов
/ 03 декабря 2018

main.cpp должно быть в порядке с объяснением, данным там самим.Тем не менее, вы упоминаете в комментарии, что у вас есть B.cpp !?Я предполагаю, что ошибка, которую вы цитируете, действительно возникает во время компиляции B.cpp, а не main.cpp.Если B.cpp включает B.h, то препроцессор будет включать B.h, который будет включать A.hA.h попытается включить B.h, но так как B.h уже был включен в этот момент, компилятор пропустит это включение из-за #pragma once, и вы введете определение class A, не увидев определенияиз class B

...