代码之家  ›  专栏  ›  技术社区  ›  tomjen

语法错误丢失;之前*

  •  6
  • tomjen  · 技术社区  · 16 年前

    我有一个这样的头文件:

    #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 回复  |  直到 11 年前
        1
  •  23
  •   Naveen    16 年前

    我猜exitListener.h直接或间接包含initialGameState.h头文件。因此头文件之间存在循环依赖关系,编译器找不到exitListener的声明。如果您只需要在此类中存储exitListener的指针,那么就不需要包含exitListener.h头文件。相反,您可以使用forward声明作为 class ExitListener;

    编辑 :您可以按照上面的建议使用forward声明,或者从exitListener.h中删除initialGameState.h include。您只需要包含gamestate.h(基类头文件)。但我更喜欢在头文件中使用前向声明,并且只在cpp中包含头文件。

        2
  •  5
  •   sbi    16 年前
    1. 错误不是指最后一行,而是指最后一行。 之前 最后一行。(请准确。如果人们对发出此错误消息的编译器了解得很好,那么如果他们知道给定的确切行,他们的猜测可能会更好。)
    2. “exitListener.h”不是类,而是头。(这不是Java。)我们假设有一个类。 ExitListener 在头中定义了(或者至少声明了),但也可以有其他类,一个都没有,或者有许多类。
    3. 如果没有这个头,就不可能准确地说出错误的地方,尽管这两个头之间要么是循环依赖,要么是缺少 ; 退出侦听器 类的定义是一个很好的猜测,它符合我在此类错误中的经验。至少我相信这个错误意味着编译器不知道 退出侦听器 是。
    4. 正如其他人所说,您不需要类定义来声明指向该类的指针,因此(假设“exitListener.h”定义了 退出侦听器 类)您根本不需要包含标题。简单的正向声明 class ExitListener; 足以声明 ExitListener *mFrameListener 成员。(为了实现 InitialGameState 处理的成员函数 退出侦听器 但是。如果您在header中实现这些功能, 初始游戏状态 如果已定义,则需要保留“exitListener.h”include。)
        3
  •  2
  •   Ashalynd    16 年前

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

        4
  •  1
  •   Patrice Bernassola    16 年前

    错误在exitListener.h文件(或其中包含的任何文件)中。这个问题通常是由于 ; 在课后。

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

        5
  •  1
  •   NewbiZ    16 年前

    问题 exitListener声明不正确。这是Vs唯一可以这么说的解决方案。 检查编译exitListener类时是否没有错误。(你没有忘记后面的“;”)

    旁注 这里您使用的是指向exitListener的指针。如果只声明指针,则不需要知道exitListener的大小或内部布局。 远期申报就足够了。

        6
  •  0
  •   LiraNuna    16 年前

    我怀疑你丢失了包含链上的食人魔包。

    我的假设是基于我对您的其他头文件所知甚少,并且VC警告说它缺少类型说明符: missing type specifier .