Ответ 1
Я не уверен, что это ваша проблема, но вы не можете подкласс QObject с классом шаблона.
Что означает эта ошибка?
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);
};
Я не уверен, что это ваша проблема, но вы не можете подкласс QObject с классом шаблона.
Взгляните на этот аналогичный вопрос в другом месте на 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);
};
может быть, что Generic уже определен где-то еще?
Проверьте, не имеет ли директива #include
непосредственно выше Generic закрытие; по определению его класса. Однажды я увидел эту ошибку, и это было причиной.
Ваша проблема в том, что вы определяете посетителя типа 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
или что-то в этом роде.
Является ли эта ошибка генерируемой компилятором С++ или Qt MOC? Возможно, вы не можете применить Qt MOC к классу шаблонов.
Кроме того, что вы не правильно определяете класс шаблона (таким образом, ваше сообщение об ошибке), вы не можете использовать Q_OBJECT в классе шаблона. Подробнее см. http://doc.trolltech.com/qq/qq15-academic.html.