缺少语法错误; *前

问题描述:

我有一个头文件,像这样:缺少语法错误; *前

#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

我的猜测是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

我怀疑你错过了Ogre包含在你的包含链中的某个地方。

我的假设是基于我对你的其他头文件的小知识,VC提醒说它缺少一个类型说明符:missing type specifier

该错误出现在ExitListener.h文件(或其包含的任何文件)中。通常这个问题是由于在课程结束时丢失了;

如果您添加此文件的代码,我将能够进一步帮助您。

问题 ExitListener被错误地声明。这是VS说这个的唯一解决方案。 检查编译ExitListener类时是否有错误。 (并且你没有忘记尾部“;”)

附注 这里你使用的是一个指向ExitListener的指针。如果只声明一个指针,则不需要知道ExitListener的大小或内部布局。 前向声明就够了。

显然,问题出在ExitListener定义上,在这一点上它不被认为是有效的。

  1. 的错误不是指的最后一行,但行最后一行之前。 (请准确。如果人们知道编译器以及发出此错误消息,他们猜测可能是好多了,如果他们知道这是在给定的确切行。)
  2. “ExitListener.h”是不是类,但一个标题。 (这是不是Java)。人们会认为有定义(或者至少声明)是水箱内的一类ExitListener,但也有可能只是以及一些其他类,根本没有,或许多类。
  3. 没有这个标题,尽管这两个标题之间的循环依赖关系或ExitListener类定义末尾缺失的;是一个非常好的猜测,并且符合我对这种错误的体验,但是不可能说出确切的错误。至少我确定这个错误意味着编译器不知道ExitListener是什么。
  4. 正如其他人所说,你不需要类定义来声明该类的指针,所以(假设“ExitListener.h”定义了ExitListener类),你根本不需要包含头。一个简单的向前声明class ExitListener;是足以声明ExitListener *mFrameListener成员。 (您将需要包括为了实现与ExitListener处理的InitialGameState成员函数,但完整的类定义。如果实现在头这些功能,其中InitialGameState定义,你需要保持这种“ExitListener.h”包括。)