C++ template for QList

C++ template for QList

本文关键字:QList for template C++      更新时间:2023-10-16

我的模板函数:

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

我试着打电话

setIndex<>(list, selectedId);

但是此调用会出错。

error: no matching member function for call to 'setIndex' (...)
note: candidate template ignored: couldn't infer template argument 'TItem'

所以我尝试了

setIndex<QList<Item>, Item>(list, selectedId);

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

(编辑(

在另一个功能的情况下,

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

对于此函数,

addItem<>(list, item)

工作。我不是在解释是什么有什么不同

你可能想要(所以可以进行演绎(:

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

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