Russian Qt Forum

Qt => Общие вопросы => Тема начата: phpCoder от Апрель 08, 2015, 10:34



Название: Не наследуется шаблон
Отправлено: phpCoder от Апрель 08, 2015, 10:34
Добрый день.
Есть код:
Код
C++ (Qt)
template<typename K, typename V> class AbstractBaseDialog : public QDialog
{
public:
   typedef QHash<K, V> Result;
   explicit AbstractBaseDialog(QWidget *parent = 0);
   virtual ~AbstractBaseDialog() {}
   ...
};
 
class AbstractFormattingDialog : public AbstractBaseDialog<QString,QStringList>
{
   Q_OBJECT
public:
   typedef Result::ConstIterator Iterator;
   explicit AbstractFormattingDialog(QStringList &source, QWidget *parent = 0);
   virtual ~AbstractFormattingDialog() {}
   ...
protected:
   ...
   virtual void _loadData() = 0;
   ...
};

Пишет это:
Код:
error: 'AbstractBaseDialog' is not a template type
 template<class K, class V> class AbstractBaseDialog : public QDialog
                                  ^
error: expected template-name before '<' token
 class AbstractFormattingDialog : public AbstractBaseDialog<QString,QStringList>
                                                           ^
error: expected '{' before '<' token
error: expected unqualified-id before '<' token

Что ему не так?


Название: Re: Не наследуется шаблон
Отправлено: sociopath от Апрель 08, 2015, 10:47
Классы, наследуемые от QObject и имеющие макрос Q_OBJECT, не могут быть шаблонными. Одно из базовых ограничений Qt как, например, то, что нельзя наследоваться от двух QObject-derived классов.


Название: Re: Не наследуется шаблон
Отправлено: phpCoder от Апрель 08, 2015, 10:48
Кажется понял.
Когда делаешь
Код
C++ (Qt)
friend class AbstractBaseDialog;
то надо делать:
Код
C++ (Qt)
template<typename K, typename V>
friend class AbstractBaseDialog;

т.е. пихать во все дыры конструкцию template<...>

PS Значит к Qt не относится.