Синтаксическая ошибка отсутствует; до * - PullRequest
6 голосов
/ 09 октября 2009

У меня есть заголовочный файл так:

#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 ]

23 голосов
/ 09 октября 2009

Я предполагаю, что ExitListener.h включает в себя заголовочный файл InitialGameState.h прямо или косвенно. Таким образом, существует круговая зависимость между файлом заголовка, и компилятор не может найти объявление для ExitListener. Если вам просто нужно сохранить указатель ExitListener в этом классе, тогда нет необходимости включать заголовочный файл ExitListener.h. Вместо этого вы можете просто использовать предварительную декларацию как class ExitListener;

РЕДАКТИРОВАТЬ : Вы можете использовать предварительное объявление, как предложено выше, или удалить файл InitialGameState.h из файла ExitListener.h. Вам нужно только включить GameState.h (файл заголовка базового класса). Но я предпочитаю использовать предварительные объявления в заголовочном файле и включать заголовочный файл только в cpp.

5 голосов
/ 09 октября 2009
  1. Ошибки относятся не к последней строке, а к строке перед последней строкой. (Пожалуйста, будьте точны. Если люди хорошо знают компилятор, который выдает это сообщение об ошибке, их догадки могут быть намного лучше, если они знают точную строку, для которой он указан.)
  2. «ExitListener.h» - это не класс, а заголовок. (Это не Java.) Можно было бы предположить, что внутри этого заголовка есть класс ExitListener, определенный (или, по крайней мере, объявленный), но также может быть какой-то другой класс, вообще ни одного, или много классов.
  3. Без этого заголовка невозможно сказать точно, что не так, хотя либо циклические зависимости между этими двумя заголовками, либо отсутствующий ; в конце определения ExitListener class '- очень хорошее предположение, которое соответствует моему опыту с такие ошибки. По крайней мере, я уверен, что ошибка означает, что компилятор не знает, что такое ExitListener.
  4. Как уже говорили другие, вам не нужно определение класса для объявления указателя на этот класс, поэтому (при условии, что "ExitListener.h" определяет класс ExitListener) вам не нужно включать заголовок совсем. Простого предварительного объявления class ExitListener; достаточно для объявления члена ExitListener *mFrameListener. (Однако вам нужно будет включить полное определение класса для реализации функций-членов InitialGameState, которые имеют дело с ExitListener. Однако, если вы реализуете эти функции в заголовке, где определено InitialGameState, вам необходимо сохранить это «ExitListener.h» включает.)
2 голосов
/ 09 октября 2009

Очевидно, что проблема в определении ExitListener, он не считается действительным в этот момент.

1 голос
/ 09 октября 2009

Проблема ExitListener был неправильно объявлен. Это единственное решение для VS, чтобы сказать это. Убедитесь, что при компиляции класса ExitListener не было ошибок. (и чтобы ты не забыл завершающий ";")

Примечание: Здесь вы используете указатель на ExitListener. Вам не нужно знать размер или внутреннюю разметку ExitListener, если вы просто объявляете указатель. Предварительной декларации будет достаточно.

1 голос
/ 09 октября 2009

Ошибка находится в файле ExitListener.h (или любом файле, который он включает). Часто эта проблема связана с отсутствием ; в конце класса.

Если вы добавите код этого файла, я смогу вам помочь.

0 голосов
/ 09 октября 2009

Я подозреваю, что вам не хватает включенных Ogre где-то в вашей цепочке включений.

Мое предположение основано на моих небольших знаниях о других ваших заголовочных файлах и предупреждениях VC о том, что в нем отсутствует спецификатор типа: missing type specifier.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...