缺少语法错误; *前
我有一个头文件,像这样:缺少语法错误; *前
#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文件中其他头。
谢谢。
我的猜测是ExitListener.h是直接或间接包含InitialGameState.h头文件。因此,头文件和编译器之间存在循环依赖关系,无法找到ExitListener的声明。如果您只需将ExitListener的指针存储在此类中,则不需要包含ExitListener.h头文件。相反,你可以只用向前声明为class ExitListener;
编辑:您可以使用前置声明如上建议,或删除InitialGameState.h从ExitListener.h包括。你只需要包含GameState.h(基类头文件)。但我更喜欢在头文件中使用前向声明,并仅在cpp中包含头文件。
如果它是ExitListener.h文件中的错误语法,则错误将仍然存在,但在使用ExitListener类的实现文件中 – 2009-10-09 08:54:56
我怀疑你错过了Ogre包含在你的包含链中的某个地方。
我的假设是基于我对你的其他头文件的小知识,VC提醒说它缺少一个类型说明符:missing type specifier
。
该错误出现在ExitListener.h文件(或其包含的任何文件)中。通常这个问题是由于在课程结束时丢失了;
。
如果您添加此文件的代码,我将能够进一步帮助您。
问题 ExitListener被错误地声明。这是VS说这个的唯一解决方案。 检查编译ExitListener类时是否有错误。 (并且你没有忘记尾部“;”)
附注 这里你使用的是一个指向ExitListener的指针。如果只声明一个指针,则不需要知道ExitListener的大小或内部布局。 前向声明就够了。
显然,问题出在ExitListener定义上,在这一点上它不被认为是有效的。
- 的错误不是指的最后一行,但行最后一行之前。 (请准确。如果人们知道编译器以及发出此错误消息,他们猜测可能是好多了,如果他们知道这是在给定的确切行。)
- “ExitListener.h”是不是类,但一个标题。 (这是不是Java)。人们会认为有定义(或者至少声明)是水箱内的一类
ExitListener
,但也有可能只是以及一些其他类,根本没有,或许多类。 - 没有这个标题,尽管这两个标题之间的循环依赖关系或
ExitListener
类定义末尾缺失的;
是一个非常好的猜测,并且符合我对这种错误的体验,但是不可能说出确切的错误。至少我确定这个错误意味着编译器不知道ExitListener
是什么。 - 正如其他人所说,你不需要类定义来声明该类的指针,所以(假设“ExitListener.h”定义了
ExitListener
类),你根本不需要包含头。一个简单的向前声明class ExitListener;
是足以声明ExitListener *mFrameListener
成员。 (您将需要包括为了实现与ExitListener
处理的InitialGameState
成员函数,但完整的类定义。如果实现在头这些功能,其中InitialGameState
定义,你需要保持这种“ExitListener.h”包括。)
错误很可能在它上面的头文件,或者你的类是在一个命名空间。 – GManNickG 2009-10-09 08:49:28
啊,我可以在ExitListener.h中看到问题。 – mackenir 2009-10-09 08:50:23
也可能是#include排序问题。 – mackenir 2009-10-09 08:50:55