Classe ‘non è un modello di tipo’

Che cosa significa questo errore significa?

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

Qui Generici.

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

};

È il problema che le sottoclassi di altre classi? Ho tentato un esperimento per testare la teoria, ma non la produzione di questo errore.

Edit: Ok, così un paio di voi ragazzi ha sottolineato potrei essere avanti dichiarando Generico altrove, senza rendere un modello di classe. È vero. E quando mi fanno un modello, ottengo un altro errore.

Proprietà.h:15: errore: ISO C++ vieta la dichiarazione di ‘Generico’ con nessun tipo di

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);
};
  • Qual è la linea 25? È il Q_OBJECT linea?
  • Ecco: classe Generica: pubblica QObject, pubblico CFG, pubblico virtuale Valutatore {
  • Scusate la ridondanza, ma Generico è abbastanza generico nome, si potrebbe desiderare di cambiare il nome in qualcosa di più descrittivo. E/o (ma soprattutto e) il luogo in uno spazio dei nomi.
  • Vero. Potrei cambiare in qualcosa di simile LCDGeneric. Grazie per il suggerimento.
InformationsquelleAutor Scott | 2009-10-19



7 Replies
  1. 22

    Dare un’occhiata a questa domanda simile altrove su COSÌ. Sei per caso in avanti-dichiara Generico da qualche parte, e non come una classe basata su modelli?

    MODIFICA:
    In risposta al tuo secondo errore…

    @Steve Guidi ha risolto questo problema nel suo commento, altrove in questa pagina. Ora che hai sempre dichiarato Generico come una classe basata su modelli, linea 15 della vostra Proprietà.h è illegale perché stai usando Generico in un tipo di modulo.

    È necessario specificare la specializzazione si sta utilizzando sulla linea 15, ad esempio,

    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);
    };
    • Ok, sì, che tipo di appena gocciola attraverso-out il mio codice, e in questo caso. Beh, è per una buona ragione, quindi non mi dispiace.
    • Gocciola giù il che significa che devo trasportare T, attraverso-out. 🙂
  2. 5

    potrebbe essere che il Generico è già stato definito da qualche altra parte?

    • No, non è questo. Generici in Generale.h solo.
    • Aspetta, in realtà ho altrove come stub.
    • Non che stub dire che è un modello?
    • No, ma quando l’ho aggiunto, ottengo un altro errore: errore: ISO C++ vieta la dichiarazione di ‘Generico’ con nessun tipo. Che per quanto riguarda questa linea: Generico di visitatore;
    • Potrebbe essere utile postare il codice che troppo.
    • mantenere lo stub declration con le direttive di modello. Il compilatore è ora dicendo che si sta tentando di utilizzare Generic non di tipo generico (ossia Generici* visitatore) – hai bisogno di specializzarsi questi casi troppo.

  3. 3

    Il tuo problema è che si sta definendo visitatore di tipo Generico con nessun modello param.

    Quando si inoltra dichiarato la classe Generica quindi alla riga 15 il compilatore trovato la dichiarazione. Ma quando hai cambiato la dichiarazione con il modello poi la classe Generica non è più trovato.

    Così, si dovrebbe fare qualcosa di simile:

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

    o

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

    o qualcosa di simile.

  4. 3

    Controllare per vedere se il #include direttiva immediatamente sopra Generic ha una chiusura ; sulla sua definizione di classe. Ho visto che l’errore una volta, e che era la causa.

  5. 1

    È che l’errore generato dal compilatore C++, o da Qt MOC? Potrebbe essere che in realtà non è possibile applicare Qt MOC su un modello di classe.

    • È dal compilatore.
    • Per inciso, ho provato la rimozione QObject, ma ho ancora l’errore.

Lascia un commento