Класс 'не является типом шаблона'

Что означает эта ошибка?

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

Здесь 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_; }

};

Проблема в том, что он подклассифицирует другие классы? Я попробовал эксперимент, проверяющий эту теорию, но это не вызвало этой ошибки.

Редактирование: Хорошо, поэтому пару из вас, ребята, указали, что я могу переслать объявление Generic в другом месте, не делая его классом шаблона. Это правда. И когда я создаю шаблон, я получаю еще одну ошибку.

Property.h: 15: ошибка: ISO С++ запрещает объявление "Generic" без типа

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

Ответы

Ответ 2

Взгляните на этот аналогичный вопрос в другом месте на SO. Вы, случайно, проговариваете Generic где-то, а не как шаблонный класс?

EDIT: В ответ на вашу вторую ошибку...

@Steve Guidi решил эту проблему в своем комментарии в другом месте на этой странице. Теперь, когда вы последовательно объявляли Generic как шаблонный класс, строка 15 вашего Property.h является незаконной, потому что вы используете Generic в незанятой форме.

Вам нужно указать специализацию, которую вы используете в строке 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);
};

Ответ 3

может быть, что Generic уже определен где-то еще?

Ответ 4

Проверьте, не имеет ли директива #include непосредственно выше Generic закрытие; по определению его класса. Однажды я увидел эту ошибку, и это было причиной.

Ответ 5

Ваша проблема в том, что вы определяете посетителя типа Generic без шаблона шаблона.

Когда вы пересылаете объявленный класс как Generic, то в строке 15 компилятор обнаружил объявление. Но когда вы изменили объявление с помощью шаблона, класс Generic больше не найден.

Итак, вы должны сделать что-то вроде:

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

или что-то в этом роде.

Ответ 6

Является ли эта ошибка генерируемой компилятором С++ или Qt MOC? Возможно, вы не можете применить Qt MOC к классу шаблонов.

Ответ 7

Кроме того, что вы не правильно определяете класс шаблона (таким образом, ваше сообщение об ошибке), вы не можете использовать Q_OBJECT в классе шаблона. Подробнее см. http://doc.trolltech.com/qq/qq15-academic.html.