我在头文件(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
似乎可以解决它。
谢谢大家的反馈。
答案 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
实例的大小。