2009-10-09 16 views
6

मैं बहुत की तरह एक हेडर फाइल है:सिंटेक्स त्रुटि गुम है; पहले *

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

इस के साथ समस्या यह है कि मैं कुलपति 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

त्रुटि इसके ऊपर एक शीर्षलेख फ़ाइल में होने की संभावना है, या शायद आपकी कक्षा नामस्थान में है। – GManNickG

+1

आह, मैं ExitListener.h में वहाँ समस्या देख सकते हैं। – mackenir

+1

एक # अंतर्निहित ऑर्डरिंग समस्या भी हो सकती है। – mackenir

उत्तर

22

मेरा अनुमान है कि ExitListener.h में InitialGameState.h शीर्षलेख फ़ाइल सीधे या अप्रत्यक्ष रूप से शामिल है। तो हेडर फ़ाइल और कंपाइलर के बीच एक परिपत्र निर्भरता है ExitListener के लिए घोषणा नहीं ढूंढ पा रहा है। यदि आपको इस कक्षा में ExitListener के पॉइंटर को स्टोर करने की आवश्यकता है तो ExitListener.h शीर्षलेख फ़ाइल को शामिल करने की आवश्यकता नहीं है। इसके बजाय आप बस के रूप में class ExitListener;

संपादित आगे घोषणा का उपयोग कर सकते हैं: के रूप में ऊपर सुझाव आप आगे घोषणा का उपयोग कर सकते हैं, या हटाने InitialGameState.h ExitListener.h से शामिल हैं। आपको केवल GameState.h (बेस क्लास हेडर फ़ाइल) शामिल करने की आवश्यकता है। लेकिन मैं हेडर फ़ाइल में आगे की घोषणाओं का उपयोग करना पसंद करता हूं और केवल सीपीपी में हेडर फ़ाइल शामिल करता हूं।

+1

यदि यह ExitListener.h में एक त्रुटि सिंटैक्स त्रुटि फाइल यहाँ अभी भी हो जाएगा लेकिन कार्यान्वयन फ़ाइल में जहां ExitListener वर्ग प्रयोग किया जाता है –

0

मुझे संदेह है कि आप ओग्रे को याद कर रहे हैं आपकी शामिल श्रृंखला में कहीं भी शामिल है।

मेरी धारणा आपके अन्य शीर्षलेख फ़ाइलों और वीसी के बारे में छोटे ज्ञान पर आधारित है जो चेतावनी देती है कि इसमें एक प्रकार का विनिर्देशक है: missing type specifier

1

त्रुटि ExitListener.h फ़ाइल में है (या इसमें से कोई भी फ़ाइल शामिल है)। अक्सर यह समस्या वर्ग के अंत में ; गुम होने के कारण होती है।

यदि आप इस फ़ाइल का कोड जोड़ते हैं तो मैं आपको और मदद करने में सक्षम हूं।

1

समस्या ExitListener गलत तरीके से घोषित किया गया। वीएस के लिए यह एकमात्र समाधान है। जांचें कि ExitListener क्लास को संकलित करते समय कोई त्रुटि नहीं हुई थी। एक तरफ ध्यान दें यहाँ आप ExitListener के लिए सूचक का उपयोग कर रहे

, (और आप पीछे भूल जाते हैं कि नहीं था "")। अगर आप सिर्फ पॉइंटर घोषित करते हैं तो आपको ExitListener के आकार या आंतरिक लेआउट को जानने की आवश्यकता नहीं है। एक आगे की घोषणा पर्याप्त होगी।

2

स्पष्ट रूप से समस्या ExitListener परिभाषा के साथ है, इसे उस बिंदु पर मान्य नहीं माना जाता है।

5
  1. त्रुटियों अंतिम पंक्ति का उल्लेख नहीं है, लेकिन अंतिम पंक्ति से पहले लाइन करने के लिए। (कृपया सटीक होना। यदि वे सही लाइन इसके लिए दिया जाता है पता है लोगों को अच्छी तरह से संकलक जो यह त्रुटि संदेश का उत्सर्जन करता है पता है, उनके अनुमान एक बहुत बेहतर हो सकता है।)
  2. "ExitListener.h" एक वर्ग नहीं है, लेकिन एक हेडर (यह जावा नहीं है।) एक ग्रहण करेंगे एक वर्ग ExitListener परिभाषित (या कम से कम घोषित) है कि शीर्ष लेख के अंदर है कि वहाँ है, लेकिन वहाँ बस के रूप में अच्छी तरह से कुछ अन्य वर्ग, सब पर कोई नहीं, या कई वर्गों हो सकता है।
  3. इस हेडर के बिना, यह कहना असंभव है कि क्या गलत है, हालांकि ExitListener वर्ग की परिभाषा के अंत में इन दो शीर्षकों या गायब ; के बीच परिपत्र निर्भरताएं एक बहुत अच्छी अनुमान है जो ऐसी त्रुटियों के साथ मेरे अनुभव को फिट करती है। कम से कम मुझे यकीन है कि त्रुटि का अर्थ है संकलक नहीं जानता है कि क्या ExitListener है हूँ।
  4. जैसा कि अन्य ने कहा है, आपको उस वर्ग में पॉइंटर घोषित करने के लिए कक्षा परिभाषा की आवश्यकता नहीं है, इसलिए (यह मानते हुए कि "ExitListener.h" ExitListener कक्षा को परिभाषित करता है) आपको शीर्षलेख को शामिल करने की आवश्यकता नहीं है । एक साधारण आगे घोषणा class ExitListener; पर्याप्त ExitListener *mFrameListener सदस्य घोषित करने के लिए है। (InitialGameState सदस्य फ़ंक्शंस को लागू करने के लिए आपको ExitListener से निपटने के लिए पूर्ण श्रेणी परिभाषा को शामिल करने की आवश्यकता होगी, यदि आप InitialGameState परिभाषित हैं, तो आप इन कार्यों को शीर्षलेख में कार्यान्वित करते हैं, तो आपको "ExitListener.h" को रखना होगा ।)
संबंधित मुद्दे