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);
}
}