未定义的类方法的引用,它继承自QAbstractItemModel继承的模板

时间:2014-11-27 11:48:19

标签: c++ qt templates inheritance

我在使用我正在处理的项目中运行派生类时遇到了一些困难。

该项目正在使用QT。我使用的是模型 - 视图架构,项目有很多模型,它们或多或少地模拟了不同的业务对象,它们共享很多逻辑。

目前,每个模型都继承自QAbstractTableModel并且功能令人满意。问题是这些模型之间存在一些重复,我强烈希望不要多次重复代码。

因此,我创建了一个通用基类,它继承自QAbstractTableModel,它实现了通用功能(向数据库添加行,执行公共业务逻辑,检索标题数据)。视图使用的模型继承自此派生类,并实现特定于表的功能(主要从表示数据的对象获取和设置数据)。因此,通用基类提供了部分功能,模型的特定实例完成了它。

所以QAbstractTableModel - > QualityItemModel - > (视图将使用的各种模型)。

QualityItemModel我已经制作了一个模板,因为一些共享代码必须使用不同的类型。

问题是,在尝试调用这些方法时,我在链接后遇到以下错误。

/home/user/program/project/UI/complaintsui.cpp:136: undefined reference to `ComplaintsModel::clear()'
moc_complaintsmodel.o:(.data.rel.ro._ZTV15ComplaintsModel[_ZTV15ComplaintsModel]+0x70): undefined reference to `ComplaintsModel::index(int, int, QModelIndex const&) const'
moc_complaintsmodel.o:(.data.rel.ro._ZTV15ComplaintsModel[_ZTV15ComplaintsModel]+0x88): undefined reference to `ComplaintsModel::rowCount(QModelIndex const&) const'
moc_complaintsmodel.o:(.data.rel.ro._ZTV15ComplaintsModel[_ZTV15ComplaintsModel]+0x90): undefined reference to `ComplaintsModel::columnCount(QModelIndex const&) const'
moc_complaintsmodel.o:(.data.rel.ro._ZTV15ComplaintsModel[_ZTV15ComplaintsModel]+0xb0): undefined reference to `ComplaintsModel::headerData(int, Qt::Orientation, int) const'
moc_complaintsmodel.o:(.data.rel.ro._ZTV15ComplaintsModel[_ZTV15ComplaintsModel]+0x140): undefined reference to `ComplaintsModel::flags(QModelIndex const&) const'

投诉模型继承自模板,该模板继承自QAbstractTableModel。奇怪的是,我添加的其他方法没有这个错误。模板在头文件中实现,因此问题不是.cpp文件中的模板代码。

代码如下。为简洁起见,我省略了实现中的代码。

QualityItemModel.h

#ifndef QUALITYITEMMODEL_H
#define QUALITYITEMMODEL_H
#include <QVector>
#include <QAbstractTableModel>

template <typename T>
class QualityItemModel : public QAbstractTableModel
{

public:
   explicit QualityItemModel(QObject *parent = 0);


  QVariant headerData(int section, Qt::Orientation orientation, int role) const;
  void remove(int row);
  int columnCount(const QModelIndex &parent) const;
  Qt::ItemFlags flags(const QModelIndex &index) const;
  QModelIndex index(int row, int column, const QModelIndex &parent) const;
  int rowCount(const QModelIndex &parent) const;
  void add(T c);
  void clear();
  bool submit();
  void junk();


protected:
  QVector<T> modelItemList;
  int currentRow;
  int row;

  typename QVector<T>::const_iterator modelItemListItr;
  typename QVector<T>::const_iterator begin() const { return modelItemList.begin(); }
  typename QVector<T>::const_iterator end() const { return modelItemList.end(); }

};

template <typename T>
QualityItemModel<T>::QualityItemModel(QObject *parent) : QAbstractTableModel(parent)
{
}

template <typename T>
QVariant QualityItemModel<T>::headerData(int section, Qt::Orientation orientation, int role) const
{

}

template <typename T>
void QualityItemModel<T>::remove(int row)
{


}


template <typename T>
int QualityItemModel<T>::columnCount(const QModelIndex &parent) const
{

}


template <typename T>
Qt::ItemFlags QualityItemModel<T>::flags(const QModelIndex &index) const
{

}


template <typename T>
QModelIndex QualityItemModel<T>::index(int row, int column, const QModelIndex &parent) const
{

}

template <typename T>
int QualityItemModel<T>::rowCount(const QModelIndex &parent) const
{

}

template <typename T>
void QualityItemModel<T>::add(T c)
{

}

template <typename T>
void QualityItemModel<T>::clear()
{

}

template <typename T>
bool QualityItemModel<T>::submit()
{


}

template <typename T>
void QualityItemModel<T>::junk() {qDebug() << "Junk";}



#endif // QUALITYITEMMODEL_H

继承此模板的代码是

ComplaintsModel.h

class ComplaintsModel : public QualityItemModel<Complaint>

使用构造函数

ComplaintsModel::ComplaintsModel(QObject *parent) :  QualityItemModel(parent)
{

}
然后

ComplaintsModel实现'data'和'setdata'方法。

稍后将以下列方式使用

ComplaintsModel *model = new ComplaintsModel(this);
model->clear() // Linker error
model->junk()  // No linker error

我怀疑它与QAbstractTableModel是一个抽象类有关,但我不太清楚如何解决这个问题。

另一种方法是我只模板辅助函数,而不是整个类。

0 个答案:

没有答案