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 *GetWrap开发者_Go百科per() { 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);
};
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);
};
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.
might be that Generic is already defined somewhere else?
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.
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.
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.
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.
精彩评论