类'不是模板类型'

时间:2009-10-19 19:42:31

标签: c++ templates

这个错误是什么意思?

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 C ++禁止声明没有类型的“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);
};

7 个答案:

答案 0 :(得分:22)

看看SO上其他地方的this similar question。你有没有机会在某个地方向前宣布Generic,而不是一个模板化的类?

修改: 回答你的第二个错误......

@Steve Guidi在本页其他地方的评论中解决了这个问题。既然你一直将Generic声明为模板化类,那么你的Property.h的第15行是非法的,因为你是以非模板形式使用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);
};

答案 1 :(得分:8)

我不确定这是不是你的问题,但你不能用模板类继承QObject。

Here is more information about that.

答案 2 :(得分:5)

可能是Generic已在其他地方定义了吗?

答案 3 :(得分:3)

检查#include上面的Generic指令是否在其类定义上有一个结束;。我曾经看过那个错误,那就是原因。

答案 4 :(得分:3)

您的问题是您正在定义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

或类似的东西。

答案 5 :(得分:1)

是C ++编译器还是Qt MOC生成的错误?可能是您无法在模板类上实际应用Qt MOC。

答案 6 :(得分:1)

除了您没有正确定义模板类的问题(因此您的错误消息),您不能在模板类中使用Q_OBJECT。 有关详细信息,请参阅http://doc.trolltech.com/qq/qq15-academic.html