2009-10-19 19 views
15

इस त्रुटि का क्या अर्थ है?कक्षा 'एक टेम्पलेट प्रकार नहीं है'

Generic.h:25: error: 'Generic' is not a template type 

यहां जेनेरिक है।

template <class T> 
class Generic: public QObject, public CFG, public virtual Evaluator { 
    Q_OBJECT 
    std::string key_; 
    std::vector<std::string> layouts_; 
    std::vector<std::string> static_widgets_; 
    std::map<std::string, std::vector<widget_template> > widget_templates_; 
    std::map<std::string, Widget *> widgets_; 
    int type_; 
    LCDWrapper *wrapper_; 

    protected: 
    LCDText *lcdText_; 

    public: 
    Generic(Json::Value *config, int type); 
    ~Generic(); 
    void CFGSetup(std::string key); 
    void BuildLayouts(); 
    void StartLayout(); 
    int GetType() { return type_; } 
    //T *GetLCD() { return lcd_; } 
    LCDText *GetLCDText() { return lcdText_; } 
    virtual void Connect(){}; 
    virtual void SetupDevice(){}; 
    std::map<std::string, Widget *> Widgets(); 
    std::string CFG_Key(); 
    LCDWrapper *GetWrapper() { return wrapper_; } 

}; 

क्या समस्या यह है कि यह अन्य वर्गों को उपclasses? मैंने सिद्धांत का परीक्षण करने की कोशिश की, लेकिन यह इस त्रुटि का उत्पादन नहीं किया।

संपादित करें: ठीक है, तो आप में से कुछ लोगों ने बताया कि मैं इसे टेम्पलेट क्लास के बिना कहीं और जेनेरिक घोषित कर सकता हूं। यह सच है। और जब मैं इसे एक टेम्पलेट बना देता हूं, तो मुझे एक और त्रुटि मिलती है।

Property.h: 15: त्रुटि: आईएसओ सी ++ 'जेनेरिक' की घोषणा कोई प्रकार

template <class T> 
class Generic; 

class Property : public CFG { 
    Generic *visitor; // line 15 
    bool is_valid; 
    QScriptValue result; 
    Json::Value *expression; 
    public: 
    Property(const Property &prop); 
    Property(Generic *v, Json::Value *section, std::string name, Json::Value *defval); 
    ~Property(); 
    bool Valid(); 
    int Eval(); 
    double P2N(); 
    int P2INT(); 
    std::string P2S(); 
    void SetValue(Json::Value val); 
    Property operator=(Property prop); 
}; 
+1

लाइन 25 क्या है? क्या यह 'Q_OBJECT' रेखा है? – eduffy

+0

यह है: क्लास जेनेरिक: सार्वजनिक क्यूओब्जेक्ट, सार्वजनिक सीएफजी, सार्वजनिक आभासी मूल्यांकनकर्ता { – Scott

+0

अनावश्यकता क्षमा करें, लेकिन जेनेरिक एक सामान्य सामान्य नाम है, तो आप नाम को और अधिक वर्णनात्मक में बदलना चाहेंगे। और/या (लेकिन ज्यादातर और) इसे नामस्थान में रखें। – GManNickG

उत्तर

6

मुझे यकीन है कि अगर यह आपकी समस्या है नहीं कर रहा हूँ, लेकिन आप नहीं कर सकते हैं एक टेम्पलेट वर्ग के साथ उपवर्ग QObject।

Here is more information about that.

+0

मुझे इससे डर था। इस पर ध्यान दिलाने के लिए धन्यवाद। – Scott

+0

आपका स्वागत है। – Gaston

+1

क्षमा करें, आपका लिंक अब जानकारी के किसी भी हिस्से को इंगित नहीं करता है। – PypeBros

2

चेक तुरंत सामान्य से ऊपर #include निर्देश एक बंद है या नहीं के साथ मनाही; इसकी कक्षा परिभाषा पर। मैंने उस त्रुटि को एक बार देखा, और यही कारण था।

0

क्या सी ++ कंपाइलर द्वारा उत्पन्न त्रुटि है, या क्यूटी एमओसी द्वारा? ऐसा हो सकता है कि आप वास्तव में टेम्पलेट वर्ग पर क्यूटी एमओसी लागू नहीं कर सकते हैं।

+0

यह कंपाइलर से है। – Scott

+0

संयोग से, मैंने QObject को हटाने का प्रयास किया, लेकिन मुझे अभी भी त्रुटि मिल गई है। – Scott

4

हो सकता है कि जेनेरिक पहले से कहीं और परिभाषित किया गया हो?

+0

नहीं, यह नहीं है। जेनेरिक केवल जेनेरिक में है। – Scott

+0

रुको, वास्तव में मेरे पास इसे स्टब के रूप में कहीं और है। – Scott

+0

क्या यह स्टब कहता है कि यह एक टेम्पलेट है? – GManNickG

20

SO पर कहीं और this similar question पर एक नज़र डालें। क्या आप किसी भी मौके से जेनेरिक को कहीं भी घोषित कर रहे हैं, न कि एक टेम्पलेटेड क्लास के रूप में?

संपादित करें: अपने दूसरे त्रुटि के जवाब में ...

@Steve Guidi इस पृष्ठ पर कहीं और उसकी टिप्पणी में इस समस्या को हल किया है। अब जब आपने जेनेरिक को एक टेम्पलेटेड क्लास के रूप में लगातार घोषित किया है, तो आपकी प्रॉपर्टी एच की लाइन 15 अवैध है क्योंकि आप जेनेरिक का उपयोग एक अनपेक्षित रूप में कर रहे हैं।

आपको उस विशेषता को निर्दिष्ट करने की आवश्यकता है जिसे आप लाइन 15 पर उपयोग कर रहे हैं, उदा।

template <class T> 
class Generic; 

class Property : public CFG { 
    Generic<int> *visitor; // specialised use of Generic 
    bool is_valid; 
    QScriptValue result; 
    Json::Value *expression; 
    public: 
    Property(const Property &prop); 
    Property(Generic *v, Json::Value *section, std::string name, Json::Value *defval); 
    ~Property(); 
    bool Valid(); 
    int Eval(); 
    double P2N(); 
    int P2INT(); 
    std::string P2S(); 
    void SetValue(Json::Value val); 
    Property operator=(Property prop); 
}; 
+0

ठीक है, हाँ, उस तरह के मामले में मेरे कोड के माध्यम से बस नीचे निकलता है। खैर, यह एक अच्छे कारण के लिए है, इसलिए मुझे कोई फर्क नहीं पड़ता। – Scott

+0

अर्थ यह है कि मुझे टी थ्रू-आउट लेना है। :) – Scott

+0

हाँ - आपको यह मिल गया है। – razlebe

2

आपकी समस्या यह है कि आप प्रकार कोई टेम्पलेट परम जेनेरिक के आगंतुक को परिभाषित कर रहे है।

जब आप कक्षा को सामान्य के रूप में घोषित करते हैं तो लाइन 15 पर संकलक को घोषणा मिली। लेकिन जब आपने टेम्पलेट के साथ घोषणा बदल दी तो क्लास जेनेरिक अब नहीं मिला है।

template <class T> 
class Generic; 

class Property : public CFG { 
    Generic<SomeType> *visitor; // line 15 

या

template <class T> 
class Generic; 

template <class T> 
class Property : public CFG { 
    Generic<T> *visitor; // line 15 

या कुछ इस तरह:

तो, आप की तरह कुछ करना चाहिए।

0

इस मुद्दे के अलावा कि आप टेम्पलेट वर्ग को सही ढंग से परिभाषित नहीं कर रहे हैं (इस प्रकार आपका त्रुटि संदेश), आप टेम्पलेट क्लास में Q_OBJECT का उपयोग नहीं कर सकते हैं। विवरण के लिए http://doc.trolltech.com/qq/qq15-academic.html देखें।

संबंधित मुद्दे