Шаблон C ++ для QList - PullRequest
       29

Шаблон C ++ для QList

0 голосов
/ 06 февраля 2020

Моя функция шаблона:

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)

работал. Я не suer, что имеет значение

1 Ответ

1 голос
/ 06 февраля 2020

Вы, вероятно, хотите (чтобы могло произойти удержание):

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