tags:

views:

1391

answers:

7

What does this error mean?

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

};

Is the problem that it subclasses other classes? I tried an experiment testing that theory, but it didn't produce this error.

Edit: Ok, so a couple of you guys pointed out I could be forward declaring Generic elsewhere without making it a template class. That's true. And when I make it a template, I get another error.

Property.h:15: error: ISO C++ forbids declaration of 'Generic' with no type

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  A: 

Check to see whether the #include directive immediately above Generic has a closing ; on its class definition. I saw that error once, and that was the cause.

David Seiler
A: 

Is that error generated by C++ compiler, or by Qt MOC? It might be that you can't actually apply Qt MOC on a template class.

Cătălin Pitiș
It's from the compiler.
Scott
Incidentally, I tried removing QObject, but I still get the error.
Scott
+3  A: 

might be that Generic is already defined somewhere else?

stijn
Nope, it's not that. Generic's in Generic.h only.
Scott
Wait, actually I have it elsewhere as a stub.
Scott
Does that stub say it's a template?
GMan
No, but when I added it, I get another error: error: ISO C++ forbids declaration of 'Generic' with no type. That's regarding this line: Generic *visitor;
Scott
It might be useful to post that code too.
sgreeve
@Scott: keep the stub declration with the template directives. The compiler is now telling you that you are attempting to use `Generic` as a non-generic type (i.e. Generic* visitor) -- you need to specialize these instances too.
Steve Guidi
+2  A: 

Take a look at this similar question elsewhere on SO. Are you by any chance forward-declaring Generic somewhere, and not as a templated class?

EDIT: In answer to your second error...

@Steve Guidi has solved this problem in his comment elsewhere on this page. Now that you've consistently declared Generic as a templated class, line 15 of your Property.h is illegal because you're using Generic in an untemplated form.

You need to specify the specialization you're using on line 15, e.g.

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);
};
sgreeve
Ok, yeah that sort of just trickles down through-out my code in that case. Well, it's for a good reason, so I don't mind.
Scott
Trickles down meaning that I have to carry T through-out. :)
Scott
Yep - you've got it.
sgreeve
+4  A: 

Hello,

I'm not sure if this is your problem, but you can't subclass QObject with a template class.

Here is more information about that.

Gastón
I was afraid of that. Thanks for pointing it out.
Scott
You're welcome.
Gastón
+1  A: 

Hi,

Your problem is that you are defining visitor of type Generic with no template param.

When you forward declared the class as Generic then at line 15 the compiler found the declaration. But when you changed the declaration with template then the class Generic is no longer found.

So, you should do something like:

template <class T>
class Generic;

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

or

template <class T>
class Generic;

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

or something like that.

Gastón
A: 

Aside from the issue that you are not defining the template class correctly (thus your error message), you cannot use a Q_OBJECT in a template class. See http://doc.trolltech.com/qq/qq15-academic.html for details.

TemporalBeing