Ошибка: доступ члена к неполному типу''; примечание: предварительное объявление ''

Вот структура MAIN, в которой есть структура-член A и структура B, код выглядит следующим образом:

// a.hpp
#ifndef _A_HPP_
#define _A_HPP_
struct A
{
    int mem1;
};
#endif
// b.hpp
#ifndef _B_HPP_
#define _B_HPP_

#include "a.hpp"
#include "main.hpp"
struct MAIN;
struct A;

struct B{
    int mem2;
    MAIN* main;
    A *aptr;
    B(){
        *aptr=this->main->a;
    }
};


#endif
// main.hpp
#ifndef _MAIN_HPP_
#define _MAIN_HPP_

#include "a.hpp"
#include "b.hpp"

struct MAIN{
    A a;
    B b;
};

#endif
// main.cpp
#include "main.hpp"
int main(){
    MAIN m;
    return 0;
}

Я хотел бы использовать aptr в структуре B, чтобы посетить A, который находится в том же MAIN, но ошибка компиляции, например

In file included from main.cpp:2:
In file included from ./main.hpp:6:
./b.hpp:15:25: error: member access into incomplete type 'MAIN'
        *aptr=this->main->a;
                        ^
./b.hpp:7:8: note: forward declaration of 'MAIN'
struct MAIN;
       ^
1 error generated.

Как возникла ошибка? мой код должен использовать структуру, но не класс, и hpp, но не h с cpp. Есть ли способ это исправить? Надеюсь на помощь

Удален тег c, так как это вопрос на С++.

Allan Wind 17.05.2022 04:31

В b.hpp вы хотите пропустить #include "main.hpp" (поскольку именно здесь вы используете предварительное объявление) и пропустить struct A; (поскольку вы его включаете). @dbush уже дал вам ответ иначе.

Allan Wind 17.05.2022 04:46
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
2
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Определение конструктора B::B внутри определения структуры ссылается на члены MAIN, но последний еще не определен полностью.

Вам нужно переместить тело конструктора B::B в отдельный файл, то есть b.cpp, и связать с main.cpp при сборке исполняемого файла.

Другие вопросы по теме