2009-10-19 30 views
15

¿Qué significa este error?Clase 'no es un tipo de plantilla'

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

Here's Generic.

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

}; 

¿El problema es que subclasifica otras clases? Probé un experimento para probar esa teoría, pero no produjo este error.

Editar: Bien, entonces un par de ustedes señalaron que podría estar adelante declarando Genérico en otro lugar sin convertirlo en una clase de plantilla. Es verdad. Y cuando lo hago una plantilla, obtengo otro error.

Property.h: 15: error: ISO C++ prohíbe declaración de 'genérico' sin ningún tipo

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

¿Qué es la línea 25? ¿Es la línea 'Q_OBJECT'? – eduffy

+0

Eso es: class Genérico: público QObject, público CFG, público virtual Evaluator { – Scott

+0

Perdón por la redundancia, pero genérico es un nombre bastante genérico, es posible que desee cambiar el nombre a algo más descriptivo. Y/o (pero principalmente y) colocarlo en un espacio de nombres. – GManNickG

Respuesta

2

Comprobar para ver si la Directiva #include inmediatamente por encima de Genérico tiene un cierre; en su definición de clase. Vi el error una vez, y esa fue la causa.

0

¿Es ese error generado por el compilador de C++ o por Qt MOC? Es posible que no pueda aplicar Qt MOC en una clase de plantilla.

+0

Es del compilador. – Scott

+0

A propósito, intenté eliminar QObject, pero sigo recibiendo el error. – Scott

4

¿Podría ser que Generic ya está definido en otro lugar?

+0

No, no es eso. Generic en Generic.h solamente. – Scott

+0

Espera, de hecho lo tengo en otro lugar como un trozo. – Scott

+0

¿Ese talón dice que es una plantilla? – GManNickG

20

Eche un vistazo a this similar question en otro lugar en SO. ¿Estás por casualidad en el futuro, declarando Genérico en alguna parte, y no como una clase de plantilla?

EDIT: En respuesta a su segundo error ...

@Steve Guidi ha resuelto este problema en su comentario en otro lugar en esta página. Ahora que ha declarado sistemáticamente a Generic como una clase con plantilla, la línea 15 de su Property.h es ilegal porque está usando Generic en una forma no listada.

Debe especificar la especialización que está utilizando en la línea 15, p. Ej.

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

Ok, sí, ese tipo de información se filtra en mi código en ese caso. Bueno, es por una buena razón, así que no me importa. – Scott

+0

Se escurre, lo que significa que tengo que llevar T en toda su extensión. :) – Scott

+0

Sí, lo tienes. – razlebe

2

Su problema es que está definiendo visitante de tipo genérico con ningún parámetro de plantilla.

Cuando reenvió declaró la clase como Genérica, en la línea 15 el compilador encontró la declaración. Pero cuando cambiaste la declaración con la plantilla, la clase Genérica ya no se encuentra.

Por lo tanto, usted debe hacer algo como:

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 algo por el estilo.

Cuestiones relacionadas