C++ 带有QVariant和模板的变量返回类型

C++ 带有QVariant和模板的变量返回类型,c++,qt,templates,C++,Qt,Templates,我正在尝试对QStandardItemModel进行子类化,以确保每当删除此QStandardItemModel的QStandardItem时,该项的数据也会被删除,该数据位于动态分配的内存中。以下是一个例子: Q_DECLARE_METATYPE(MyType*) MyType* myData = new MyType; QStandardItem* myItem = new QStandardItem; QVariant var; var.setValue(myData); myItem-

我正在尝试对
QStandardItemModel
进行子类化,以确保每当删除此
QStandardItemModel
QStandardItem
时,该项的数据也会被删除,该数据位于动态分配的内存中。以下是一个例子:

Q_DECLARE_METATYPE(MyType*)

MyType* myData = new MyType;
QStandardItem* myItem = new QStandardItem;
QVariant var;
var.setValue(myData);
myItem->setData(var);
现在,当我从项目模型中删除
myItem
时,我想确保
myData
也被删除。因此,我继承了
QStandardItemModel
,如下所示:

// header file
#include <QStandardItemModel>
#include <QStandardItem>
#include <QTreeView>
#include <QVariant>
#include <QModelIndex>


class TreeViewItemModel: public QStandardItemModel {

public:
    TreeViewItemModel(QTreeView* parent = 0) {}

    template <typename T> void delete_dynamic_item(QStandardItem* item,
        int role = Qt::DisplayRole);

    virtual ~TreeViewItemModel() {}

private:
    Q_OBJECT


};

// source file
#include "tree_view_item_model.h"

template <typename T>
void TreeViewItemModel::delete_dynamic_item(QStandardItem* item,
    int role) {

    int row = item->row();
    QModelIndex parentIndex = this->indexFromItem(item->parent());

    QVariant itemVariant = item->data(role);
    T itemData = itemVariant.value<T>();
    delete itemData;

    this->removeRow(row, parentIndex);

}

但它们对我不起作用。如果您能在这方面提供帮助,我将不胜感激。

我认为问题在于您的.cpp文件中有模板实现,而不是header.h文件。将实现移动到头文件。您可以查看更详细的解释。

“因此我将QStandardItemModel子类化如下:“您不是子类化QStandardItemModel,您只是子类化TreeViewItemModel,这不会影响QStandardItemModel。oops。。。对不起,你说得对。我修好了。谢谢。是的,当我按照你和另一个答案的建议将实现移动到头部时,我能够编译并运行我的程序。但奇怪的是,在我的源代码中的另一点上,我能够分离模板实现并将其放入.cpp文件中,它仍然有效。也许我应该阅读更多关于C++中的模板。谢谢你的帮助。
T itemData = (T) itemVariant.value<void*>();