【问题标题】:C++ template for QListQList 的 C++ 模板
【发布时间】:2020-02-06 12:22:31
【问题描述】:

我的模板函数:

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&lt;&gt;(list, selectedId);

但是这个调用出错了。

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

所以我尝试了

setIndex&lt;QList&lt;Item&gt;, Item&gt;(list, selectedId);

然后它起作用了。我仍然不明白为什么第一个失败了。

(编辑)

如果是其他功能,

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

对于这个功能,

addItem&lt;&gt;(list, item)

工作。我不知道有什么区别

【问题讨论】:

  • 您必须在&lt; &gt; 之间指定模板实例,以便编译器知道它应该为哪些类生成模板化代码。在您的第一个示例中,这是空的,因此它不知道 TItem 和 TLIst 应该是哪个类
  • 使用模板需要在编译时知道参数的类型,并且需要将它们传递到&lt; &gt;
  • setIndex(list, selectedId); 有效吗?模板参数应该从函数参数中推导出来。
  • 谢谢你们,我编辑比较了。
  • 类似情况,我认为:stackoverflow.com/questions/57890027/…

标签: c++ qt templates qlist


【解决方案1】:

你可能想要(所以可以扣除):

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

【讨论】:

  • 谢谢!正如您所指导的那样, TList 没用。我编辑了帖子以与另一个案例进行比较。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多