我有一个像这样的头文件:
#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 :(得分:23)
我的猜测是ExitListener.h直接或间接包含InitialGameState.h头文件。所以头文件和编译器之间存在循环依赖关系,无法找到ExitListener的声明。如果您只需要在此类中存储ExitListener的指针,则无需包含ExitListener.h头文件。相反,您可以将前向声明用作class ExitListener;
编辑:您可以使用上面建议的转发声明,或者从ExitListener.h中删除InitialGameState.h包含。您只需要包含GameState.h(基类头文件)。但我更喜欢在头文件中使用前向声明,并仅在cpp。
中包含头文件答案 1 :(得分:5)
ExitListener
(或者至少声明了),但也可以是其他类,根本没有,或者很多类。 ;
类'定义结尾处的缺失ExitListener
是一个非常好的猜测符合我的经验与这些错误。至少我确定错误意味着编译器不知道ExitListener
是什么。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
。