3

聞いたことのない 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;
};

ショット.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 つの行はかなり長い間完全に機能していましたが、なぜ突然これらのエラーが発生し始めたのか、私にはよくわかりません。ベクトルを埋める試みはまだ開始しておらず、関数はまだ呼び出されていません。

4

2 に答える 2

3

2 つのヘッダー ファイルが相互に参照しています。Shotただし、Shot.h はで参照されているため、ShootManager.h には明らかに必要ですShootManager

したがって、クライアント プログラムが Shot.h と ShootManager.h のどちらを #include するか、両方を #include する場合は、どちらの順序で #include するかによって違いが生じます。Shot.h を最初に #include するとうまくいきます。そうしないと、宣言されていない識別子を使用してクラスをテンプレート化できないため、そうではありません。

から削除#include "ShootManager.h"Shot.h、結果として壊れたものを修正します (おそらく#include "ShootManager.h"クライアント コードに欠落しています)。

@kfsone がコメントで指摘しているように、#include "Shot.h"fromを削除しShootManager.hて、 forward-declaration に置き換えることもできますclass Shot;。そうすることで、クライアント コードに両方のクラスを含めることが強制されるShootManager.hためShot.h、さらに多くの修正が必要になる可能性がありますが、これが最もクリーンなソリューションであることは間違いありません。

于 2013-10-24T04:28:35.353 に答える
2

エラーは とは関係ありませんstd::vector。これら 2 つのヘッダー ファイル間に循環依存関係があります。ヘッダーファイルで前方宣言Shotすることをお勧めします。ShootManager

// ShootManager.h

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

また、名前空間全体stdをヘッダーに持ち込むことは避けてください。代わりに、使用する場所に書き込みusing std::vector;または接頭辞stdを付けますvector

于 2013-10-24T04:30:06.590 に答える