C ++向量语法错误

时间:2013-10-24 04:23:45

标签: c++ vector syntax-error

我收到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;

这两行在相当长的一段时间内完美运行,我真的不知道是什么导致它突然开始犯这些错误。 我还没有开始尝试填充向量,但到目前为止还没有调用任何函数。

2 个答案:

答案 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.hShot.h,如果他们同时使用这两个类,那么它可能需要更多的修正,但它肯定是最干净的解决方案。

答案 1 :(得分:2)

错误与std::vector无关。这两个头文件之间存在循环依赖关系。我建议在Shot头文件中声明ShootManager

// ShootManager.h

#include "VGCVirtualGameConsole.h"
#include <vector>
class Shot;

另外,请避免将整个std命名空间带到标头中。而是在using std::vector;使用stdvector前写{。}}。