QLIST的C++模板

QLIST的C++模板,c++,qt,templates,qlist,C++,Qt,Templates,Qlist,我的模板功能: template<typename TList, typename TItem> void setIndex(TList &list, QString &selectedId) { typename QList<TItem>::iterator iter; for (iter = list.begin(); iter != list.end(); iter++){ if(iter->id() == se

我的模板功能:

template<typename TList, typename TItem>
void setIndex(TList &list, QString &selectedId)
{
    typename QList<TItem>::iterator iter;
    for (iter = list.begin(); iter != list.end(); iter++){
        if(iter->id() == selectedId){
            m_curItemIdx = iter - list.begin();

            break;
        }
    }
}
所以我试过了

setIndexlist,选择edid

然后它成功了。我仍然不清楚为什么第一个失败了

编辑

如果是另一个函数

template<typename TList, typename TItem>
void addItem(TList &list, TItem &item)
{
    beginInsertRows(QModelIndex(), rowCount(), rowCount());
    list << item;
    endInsertRows();
}
对于此功能

template<typename TList, typename TItem>
void addItem(TList &list, TItem &item)
{
    beginInsertRows(QModelIndex(), rowCount(), rowCount());
    list << item;
    endInsertRows();
}
附加项列表,项目


成功了。我不知道是什么造成了不同

你可能想要这样的结果:

template<typename TItem>
void setIndex(const QList<TItem>& list, const QString &selectedId)
{
    typename QList<TItem>::iterator iter;
    for (iter = list.begin(); iter != list.end(); ++iter) {
        if (iter->id() == selectedId) {
            m_curItemIdx = iter - list.begin();

            break;
        }
    }
}


您必须在<>之间指定模板实例,以便编译器知道应该为哪些类生成模板化代码。在您的第一个示例中,这是空的,因此它不知道应该使用哪个类TItem和TLIst模板需要知道编译时参数的类型,您需要将它们传递到<>Does setIndexlist,selectedId;工作模板参数应该是从函数参数推导出来的。谢谢你的评论,我编辑了比较。类似的情况,我想:谢谢!正如你所引导的,这个列表是无用的。我编辑了这篇文章以与另一个案例进行比较。
template <typename Container>
void setIndex(const Container& c, const QString& selectedId)
{
    auto it = std::find_if(c.begin(),
                           c.end(),
                           [&](const auto& item){ return item.id() == selectedId });
    if (it != c.end()) {
        m_curItemIdx = std::distance(c.begin(), it);
    }
}