2013-10-24 2 views
3

나는 표준을 얻고있다 : : 나는 결코 들어 본 적이 없으며 그것에 대해 아무것도 찾을 수 없습니다. ShootManager.hC++ 벡터 구문 오류

#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; 

을 위해이 두 라인은 꽤 많은 시간 동안 완벽하게 작동하고 정말 갑자기 이러한 오류를 만들기 시작 원인을 알 수 없습니다. 아직 벡터 채우기를 시도했지만 아직 함수가 호출되지 않았습니다.

답변

3

두 개의 헤더 파일이 서로를 참조합니다. 그러나 ShootManagerShot이 참조되어 있기 때문에 Shoot.h는 ShotManager.h에 분명히 필요합니다.

그래서 클라이언트 프로그램이 # Shot.h 또는 ShootManager.h를 포함하는지 여부와 둘 다 # 순서에 따라 포함되는지 여부가 달라집니다. Shot.h가 먼저 #include되면 모든 것이 작동합니다. 그렇지 않으면 선언되지 않은 식별자를 사용하여 클래스를 템플릿으로 만들 수 없으므로 그렇지 않습니다.

내가 Shot.h에서 #include "ShootManager.h"을 제거하고 그 결과로 나누기 무엇이든 직접 해결하려면 (클라이언트 코드에서 아마 누락 된 #include "ShootManager.h"합니다.)

@kfsone이 코멘트에 지적한 것처럼, 당신은 또한 ShootManager.h에서 #include "Shot.h"을 제거 할 수 있습니다 , 앞으로 선언으로 대체하십시오 class Shot;. 이렇게하면 클라이언트 코드가 두 클래스를 모두 사용하는 경우 ShootManager.hShot.h을 포함하게되므로 더 많은 픽스 업이 필요할 수 있지만 확실히 가장 깨끗한 솔루션이됩니다.

+0

Shot.h를 포함하는 대신 ShotManager.h에'class Shot;'을 넣으면됩니다. – kfsone

+0

@kfsone : std :: vector를 불완전한 타입으로 만들 수 없으므로 도움이되지 않습니다. – rici

+0

그는 벡터가 아니고 벡터 입니다. kfsone

2

오류는 std::vector과 아무런 관련이 없습니다. 이 두 헤더 파일 사이에 순환 종속성이 있습니다. ShootManager 헤더 파일에 Shot을 앞에 선언하는 것이 좋습니다.

// ShootManager.h 

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

또한 전체 std 네임 스페이스를 헤더에 포함시키지 마십시오. 대신 using std::vector;으로 작성하거나 std 접두사를 쓰십시오. vector을 어디에 사용하십니까?