2009-10-09 14 views
6

Tengo un archivo de cabecera de este modo:Falta el error de sintaxis; antes *

#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; 
}; 

El problema con esto es que tengo los siguientes errores de 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 

(todos ellos se refieren a la última línea)

tengo una clase ExitListener.h por lo que no consigo los errores

Editar: 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; 
}; 

Edición 2:

Resultó que el problema podría resolverse mediante una declaración hacia adelante y luego la otra cabecera que incluye directamente en mi archivo .cpp.

Gracias.

+0

es probable que el error en un archivo de cabecera por encima de ella, o tal vez su clase está en un espacio de nombres. – GManNickG

+1

Ah, puedo ver el problema allí, en ExitListener.h. – mackenir

+1

Podría ser un problema de pedido #include también. – mackenir

Respuesta

22

Supongo que ExitListener.h incluye el archivo de encabezado InitialGameState.h directa o indirectamente. Entonces hay una dependencia circular entre el archivo de encabezado y el compilador no puede encontrar la declaración para ExitListener. Si solo necesita almacenar el puntero de ExitListener en esta clase, entonces no es necesario incluir el archivo de encabezado ExitListener.h. En su lugar sólo se puede utilizar la declaración hacia adelante como class ExitListener;

EDITAR: Puede utilizar la declaración hacia adelante como se sugirió anteriormente, o quitar el InitialGameState.h incluyen desde ExitListener.h. Solo debe incluir GameState.h (el archivo de encabezado de clase base). Pero prefiero usar las declaraciones directas en el archivo de encabezado e incluir el archivo de encabezado solo en cpp.

+1

Si se trata de una sintaxis de error en el archivo ExitListener.h, el error permanecerá aquí pero en el archivo de implementación donde se usa la clase ExitListener –

0

Sospecho que te estás perdiendo el Ogre incluye en algún lugar de tu cadena de inclusión.

Mi suposición se basa en el poco conocimiento que tengo sobre sus otros archivos de encabezado y en el aviso de VC de que falta un especificador de tipo: missing type specifier.

1

El error está en el archivo ExitListener.h (o en cualquiera de los archivos que incluye). A menudo, este problema se debe a que falta ; al final de la clase.

Si agrega el código de este archivo, podré ayudarlo más.

1

El problema ExitListener fue declarado incorrectamente. Esta es la única solución para VS para decir esto. Compruebe que no haya ningún error al compilar la clase ExitListener. (Y que no olvida el arrastre ";")

Una nota al margen Aquí está utilizando un puntero a ExitListener. No necesita saber el tamaño o el diseño interno de ExitListener si solo declara un puntero. Una declaración directa sería suficiente.

2

Aparentemente el problema es con la definición de ExitListener, no se considera válido en ese momento.

5
  1. Los errores no se refieren a la última línea, pero a la línea antes de la última línea. (Por favor sea preciso. Si la gente sabe bien el compilador que emite este mensaje de error, sus conjeturas podrían ser mucho mejor si saben que la línea exacta que se da para.)
  2. "ExitListener.h" no es una clase, pero un encabezado. (Esto no es Java.) Uno supondría que hay una clase ExitListener definida (o al menos declarada) dentro de ese encabezado, pero podría ser otra clase, ninguna, o muchas clases.
  3. Sin este encabezado, es imposible decir exactamente lo que está mal, aunque las dependencias circulares entre estos dos encabezados o ; faltante al final de la definición de la clase ExitListener son una muy buena conjetura que se ajusta a mi experiencia con dichos errores. Por lo menos, estoy seguro de que el error significa que el compilador no sabe qué es ExitListener.
  4. Como han dicho otros, no necesita una definición de clase para declarar un puntero a esa clase, por lo que (suponiendo que "ExitListener.h" defina la clase ExitListener) no necesita incluir el encabezado en absoluto . Una simple declaración directa class ExitListener; es suficiente para declarar al miembro ExitListener *mFrameListener. (Usted tendrá que incluir la definición de clase completo con el fin de implementar las funciones InitialGameState miembros que se ocupan de ExitListener, sin embargo. Si implementa estas funciones en la cabecera, donde se define InitialGameState, tendrá que mantener esa "ExitListener.h" incluye .)
Cuestiones relacionadas