В 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
.