语法错误丢失;之前*

时间:2009-10-09 08:44:32

标签: c++ visual-c++

我有一个像这样的头文件:

#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文件中包含其他标题。

感谢。

6 个答案:

答案 0 :(得分:23)

我的猜测是ExitListener.h直接或间接包含InitialGameState.h头文件。所以头文件和编译器之间存在循环依赖关系,无法找到ExitListener的声明。如果您只需要在此类中存储ExitListener的指针,则无需包含ExitListener.h头文件。相反,您可以将前向声明用作class ExitListener;

编辑:您可以使用上面建议的转发声明,或者从ExitListener.h中删除InitialGameState.h包含。您只需要包含GameState.h(基类头文件)。但我更喜欢在头文件中使用前向声明,并仅在cpp。

中包含头文件

答案 1 :(得分:5)

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

答案 2 :(得分:2)

显然问题在于ExitListener定义,在那时它被认为是无效的。

答案 3 :(得分:1)

错误发生在ExitListener.h文件(或它包含的任何文件)中。通常这个问题是由于课程结束时缺少;

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

答案 4 :(得分:1)

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

旁注 在这里,您使用指向ExitListener的指针。如果只声明指针,则无需知道ExitListener的大小或内部布局。 前瞻声明就足够了。

答案 5 :(得分:0)

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

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