La classe ‘n’est pas un type de modèle’

Que signifie cette erreur?

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

Voici générique.

 template  class Generic: public QObject, public CFG, public virtual Evaluator { Q_OBJECT std::ssortingng key_; std::vector layouts_; std::vector static_widgets_; std::map<std::string, std::vector > widget_templates_; std::map widgets_; int type_; LCDWrapper *wrapper_; protected: LCDText *lcdText_; public: Generic(Json::Value *config, int type); ~Generic(); void CFGSetup(std::ssortingng 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 Widgets(); std::ssortingng CFG_Key(); LCDWrapper *GetWrapper() { return wrapper_; } }; 

Le problème est-il qu’il sous-classe d’autres classes? J’ai essayé une expérience testant cette théorie, mais cela n’a pas produit cette erreur.

Edit: Ok, alors quelques-uns d’entre vous ont fait remarquer que je pouvais être en train de déclarer le générique ailleurs sans en faire une classe de modèle. C’est vrai. Et quand je fais un modèle, je reçois une autre erreur.

Property.h: 15: error: ISO C ++ interdit la déclaration de ‘générique’ sans type

 template  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::ssortingng name, Json::Value *defval); ~Property(); bool Valid(); int Eval(); double P2N(); int P2INT(); std::ssortingng P2S(); void SetValue(Json::Value val); Property operator=(Property prop); }; 

Je ne suis pas sûr que ce soit votre problème, mais vous ne pouvez pas sous-classe QObject avec une classe de modèle.

Voici plus d’informations à ce sujet.

Jetez un oeil à cette question similaire ailleurs sur SO. Êtes-vous par hasard déclaré générique quelque part, et non comme une classe basée sur un modèle?

EDIT: En réponse à votre deuxième erreur …

@Steve Guidi a résolu ce problème dans son commentaire ailleurs sur cette page. Maintenant que vous avez systématiquement déclaré Generic en tant que classe basée sur un modèle, la ligne 15 de votre Property.h est illégale car vous utilisez Generic sous une forme sans modèle.

Vous devez spécifier la spécialisation que vous utilisez à la ligne 15, par exemple

 template  class Generic; class Property : public CFG { Generic *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::ssortingng name, Json::Value *defval); ~Property(); bool Valid(); int Eval(); double P2N(); int P2INT(); std::ssortingng P2S(); void SetValue(Json::Value val); Property operator=(Property prop); }; 

Peut-être que le générique est déjà défini ailleurs?

Votre problème est que vous définissez le visiteur de type générique sans paramètre de modèle.

Lorsque vous transférez la classe déclarée en tant que générique, le compilateur trouve la déclaration à la ligne 15. Mais lorsque vous avez modifié la déclaration avec modèle, la classe Generic n’est plus trouvée.

Donc, vous devriez faire quelque chose comme:

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

ou

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

ou quelque chose comme ça.

Vérifiez si la directive #include immédiatement supérieure à Generic a une fermeture ; sur sa définition de classe. J’ai vu cette erreur une fois, et c’était la cause.

Cette erreur est-elle générée par le compilateur C ++ ou par Qt MOC? Il se peut que vous ne puissiez pas réellement appliquer Qt MOC sur une classe de modèle.

Mis à part le problème que vous ne définissez pas correctement la classe de modèle (donc votre message d’erreur), vous ne pouvez pas utiliser un Q_OBJECT dans une classe de modèle. Voir http://doc.trolltech.com/qq/qq15-academic.html pour plus de détails.