如何使用具有其他一些功能的头文件中的结构?

时间:2018-05-19 15:59:06

标签: c++ oop

我在头文件(usefulFunctions.h)中有一个struct(struct People),这个头文件还有一些与struct无关的其他函数。 在另一个头文件(shoppers.h)中,我正在尝试创建std::vector<People *> shoppersToday,但我收到以下错误

  

模板参数1无效        std::vector<People*> shoppersToday;

     

人们未在此范围内宣布

我的shoppers.h文件中有#include "usefulFunctions.h",但我不知道为什么它不起作用。

---编辑1 ---

//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 --- 在usefulFunctions.h文件中添加了#include<shoppers.h>,仍然收到相同的错误

---编辑3 --- 在struct People之后添加#include似乎可以解决它。 谢谢大家的反馈。

1 个答案:

答案 0 :(得分:1)

在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实例的大小。