我收到std :: vector错误,我从未听说过,也无法找到任何相关信息。
ShootManager.h
#pragma once
#include "VGCVirtualGameConsole.h"
#include "Shot.h"
#include <vector>
using namespace std;
class ShootManager
{
public:
ShootManager();
~ShootManager();
void Destroy(int ShotNr);
void Update();
void Draw();
void Fire(Shot* shot);
vector<Shot*> shots;
};
Shot.h
#pragma once
#include "VGCVirtualGameConsole.h"
#include "ShootManager.h"
using namespace std;
class Shot
{
public:
virtual ~Shot();
virtual void Update() = 0;
void Draw();
void Move();
enum Alignment
{
FRIEND, ENEMY
};
protected:
VGCVector position;
VGCVector speed;
Alignment alignment;
bool Destroyed = false;
};
我收到这些错误
Error 3 error C2059: syntax error : '>'
Error 7 error C2059: syntax error : '>'
Error 1 error C2061: syntax error : identifier 'Shot'
Error 5 error C2061: syntax error : identifier 'Shot'
Error 2 error C2065: 'Shot' : undeclared identifier
Error 6 error C2065: 'Shot' : undeclared identifier
Error 4 error C2976: 'std::vector' : too few template arguments
Error 8 error C2976: 'std::vector' : too few template arguments
标识符错误适用于此行
void Fire(Shot* shot);
休息
vector<Shot*> shots;
这两行在相当长的一段时间内完美运行,我真的不知道是什么导致它突然开始犯这些错误。 我还没有开始尝试填充向量,但到目前为止还没有调用任何函数。
答案 0 :(得分:3)
您的两个头文件互相引用。但是,ShootManager.h显然需要Shot.h,因为Shot
中引用了ShootManager
。
因此,客户端程序#includes Shot.h或ShootManager.h是否有所不同,以及它是否包含两者,以何种顺序排列。如果Shot.h首先是#included,那么事情就会奏效。否则他们不会,因为你不能使用未声明的标识符模板化一个类。
我会从#include "ShootManager.h"
删除Shot.h
,然后根据结果修复任何中断(可能在客户端代码中缺少#include "ShootManager.h"
。)
正如@kfsone在评论中指出的那样,您也可以从#include "Shot.h"
中删除ShootManager.h
,将其替换为前向声明class Shot;
。这样做会强制客户端代码包含ShootManager.h
和Shot.h
,如果他们同时使用这两个类,那么它可能需要更多的修正,但它肯定是最干净的解决方案。
答案 1 :(得分:2)
错误与std::vector
无关。这两个头文件之间存在循环依赖关系。我建议在Shot
头文件中声明ShootManager
。
// ShootManager.h
#include "VGCVirtualGameConsole.h"
#include <vector>
class Shot;
另外,请避免将整个std
命名空间带到标头中。而是在using std::vector;
使用std
或vector
前写{。}}。