2009-10-09 121 views
6

我有一個頭文件,像這樣:缺少語法錯誤; *前

#pragma once 
#include "gamestate.h" 
#include "ExitListener.h" 

class InitialGameState : public GameState 
{ 
public: 
    InitialGameState(Ogre::Camera *cam, Ogre::SceneManager *sceneMgr, OIS::Keyboard  *keyboard, OIS::Mouse *mouse, Ogre::Root *root); 
    ~InitialGameState(void); 
    virtual bool update(Ogre::Real time); 
    virtual void pause(void); 
    virtual void start(void); 
    void keyPressed(const OIS::KeyEvent &e); 
    void keyReleased(const OIS::KeyEvent &e); 
//private: 
ExitListener *mFrameListener; 
}; 

的問題,這是我收到以下錯誤,從VC 8:

InitialGameState.h(16) : error C2143: syntax error : missing ';' before '*' 
InitialGameState.h(16) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
InitialGameState.h(16) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 

(他們都指到最後一行)

我有一個類ExitListener.h這就是爲什麼我沒有得到錯誤

編輯:ExitListener.h:

#pragma once 
#include <Ogre.h> 
#include <OIS/OIS.h> 
#include <CEGUI/CEGUI.h> 
#include <OgreCEGUIRenderer.h> 
#include "Thing.h" 
#include "InitialGameState.h" 

using namespace Ogre; 
class ExitListener : public FrameListener, public OIS::KeyListener, public  OIS::MouseListener 
{ 
public: 
ExitListener(OIS::Keyboard *keyboard, OIS::Mouse *mouse, Camera *cam, std::vector<Thing*> &vec): 
    mKeyboard(keyboard), r(0.09), mContinue(true), mRunningAnimation(false), 
mMouse(mouse), mYaw(0), mPitch(0), things(vec), mCamera(cam), mWDown(false), mSDown(false), mADown(false), 
mDDown(false) 
{ 
    things = vec; 
    mKeyboard->setEventCallback(this); 
    mMouse->setEventCallback(this); 
} 
bool frameStarted(const FrameEvent& evt); 
bool keyPressed(const OIS::KeyEvent &e); 
bool keyReleased(const OIS::KeyEvent &e); 
bool mouseMoved(const OIS::MouseEvent &e); 
bool mousePressed(const OIS::MouseEvent &e, OIS::MouseButtonID id); 
bool mouseReleased(const OIS::MouseEvent &e, OIS::MouseButtonID id); 

void setOwner(GameState *g); 

private: 
    AnimationState *mSwim; 
    Radian r; 
    Radian mYaw; 
    Radian mPitch; 
    OIS::Keyboard *mKeyboard; 
    OIS::Mouse *mMouse; 
    Camera *mCamera; 
    bool mContinue; 
    bool mRunningAnimation; 
    std::vector<Thing*> &things; 
    bool mWDown; 
    bool mADown; 
    bool mDDown; 
    bool mSDown; 
    GameState *mOwner; 
}; 

編輯2:

原來,這個問題可以通過預先聲明來解決,然後直接包括我.cpp文件中其他頭。

謝謝。

+0

錯誤很可能在它上面的頭文件,或者你的類是在一個命名空間。 – GManNickG 2009-10-09 08:49:28

+1

啊,我可以在ExitListener.h中看到問題。 – mackenir 2009-10-09 08:50:23

+1

也可能是#include排序問題。 – mackenir 2009-10-09 08:50:55

回答

22

我的猜測是ExitListener.h是直接或間接包含InitialGameState.h頭文件。因此,頭文件和編譯器之間存在循環依賴關係,無法找到ExitListener的聲明。如果您只需將ExitListener的指針存儲在此類中,則不需要包含ExitListener.h頭文件。相反,你可以只用向前聲明爲class ExitListener;

編輯:您可以使用前置聲明如上建議,或刪除InitialGameState.h從ExitListener.h包括。你只需要包含GameState.h(基類頭文件)。但我更喜歡在頭文件中使用前向聲明,並僅在cpp中包含頭文件。

+1

如果它是ExitListener.h文件中的錯誤語法,則錯誤將仍然存在,但在使用ExitListener類的實現文件中 – 2009-10-09 08:54:56

0

我懷疑你錯過了Ogre包含在你的包含鏈中的某個地方。

我的假設是基於我對你的其他頭文件的小知識,VC提醒說它缺少一個類型說明符:missing type specifier

1

該錯誤出現在ExitListener.h文件(或其包含的任何文件)中。通常這個問題是由於在課程結束時丟失了;

如果您添加此文件的代碼,我將能夠進一步幫助您。

1

問題 ExitListener被錯誤地聲明。這是VS說這個的唯一解決方案。 檢查編譯ExitListener類時是否有錯誤。 (並且你沒有忘記尾部「;」)

附註 這裏你使用的是一個指向ExitListener的指針。如果只聲明一個指針,則不需要知道ExitListener的大小或內部佈局。 前向聲明就夠了。

2

顯然,問題出在ExitListener定義上,在這一點上它不被認爲是有效的。

5
  1. 的錯誤不是指的最後一行,但行最後一行之前。 (請準確。如果人們知道編譯器以及發出此錯誤消息,他們猜測可能是好多了,如果他們知道這是在給定的確切行。)
  2. 「ExitListener.h」是不是類,但一個標題。 (這是不是Java)。人們會認爲有定義(或者至少聲明)是水箱內的一類ExitListener,但也有可能只是以及一些其他類,根本沒有,或許多類。
  3. 沒有這個標題,儘管這兩個標題之間的循環依賴關係或ExitListener類定義末尾缺失的;是一個非常好的猜測,並且符合我對這種錯誤的體驗,但是不可能說出確切的錯誤。至少我確定這個錯誤意味着編譯器不知道ExitListener是什麼。
  4. 正如其他人所說,你不需要類定義來聲明該類的指針,所以(假設「ExitListener.h」定義了ExitListener類),你根本不需要包含頭。一個簡單的向前聲明class ExitListener;是足以聲明ExitListener *mFrameListener成員。 (您將需要包括爲了實現與ExitListener處理的InitialGameState成員函數,但完整的類定義。如果實現在頭這些功能,其中InitialGameState定義,你需要保持這種「ExitListener.h」包括。)
相關問題