Как я могу использовать структуру из заголовочного файла, который также имеет некоторые другие функции? - PullRequest
0 голосов
/ 19 мая 2018

У меня есть структура (struct People) в файле заголовка (полезноFunctions.h), и этот файл заголовка имеет некоторые другие функции, которые не связаны со структурой.В другом заголовочном файле (shoppers.h) я пытаюсь создать std::vector<People *> shoppersToday, но я получаю следующие ошибки

Недопустимый аргумент шаблона 1 std::vector<People*> shoppersToday;

Людине было объявлено в этой области

У меня есть #include "usefulFunctions.h" в моем файле shoppers.h, но я понятия не имею, почему он не работает.

--- Edit1 ---

//usefulFunctions.h
#ifndef USEFULFUNCTIONS_H
#define USEFULFUNCTIONS_H
#include "shoppers.h"

void isNoItemsInBag();

struct People{
Shoppers * shoppee;
};
#endif

//shoppers.h
#ifndef SHOPPERS_H
#define SHOPPERS_H
#include "usefulFunctions.h"
struct People;
class Shoppers{
 std::vector<People *> shoppersToday;
};
#endif

--- Редактировать 2 --- Добавлен #include<shoppers.h> в файл ПолезныйФункции.h, все еще получая ту же ошибку

--- Редактировать 3 -- Добавление struct People после #include s, кажется, решает эту проблему.Спасибо всем за ваш отзыв.

1 Ответ

0 голосов
/ 19 мая 2018

В C ++ объявление видимо только ниже точки, в которой оно объявлено.Так, например, это действительно:

struct People { ... };
std::vector<People *> peoplePointers;

, а это не так:

std::vector<People *> peoplePointers;   // INVALID
struct People { ... };

Ваша проблема в том, что вы включаете shoppers.h до вы объявляете People, поэтому shoppers.h не может использовать это объявление.

В вашем случае простое изменение порядка вещей или переключение включает не поможет, потому что у вас фактически есть взаимозависимость: Shoppers зависит от People и наоборот.

Вместо этого вы должны написать предварительное объявление :

struct People;

Это объявляет People как существующий класстем самым позволяя любому коду после этого ссылаться на него.,, при условии, что этот код не должен знать содержимое класса.Итак, что-то вроде этого хорошо:

struct People;
std::vector<People *> peoplePointers;
struct People { ... };

, но это не так:

struct People;
std::vector<People> peoplePointers; // INVALID
struct People { ... };

, потому что std::vector<People> должен знать размер экземпляра People.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...