语法错误丢失; 之前*

tom*_*jen 6 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;
};
Run Code Online (Sandbox Code Playgroud)

这个问题是我从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  
Run Code Online (Sandbox Code Playgroud)

(他们都是指最后一行)

我有一个课程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;
};
Run Code Online (Sandbox Code Playgroud)

编辑2:

事实证明,问题可以通过前向声明解决,然后直接在我的.cpp文件中包含其他标头.

谢谢.

Nav*_*een 23

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

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


sbi*_*sbi 5

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