【发布时间】: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<>(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)
工作。我不知道有什么区别
【问题讨论】:
-
您必须在
< >之间指定模板实例,以便编译器知道它应该为哪些类生成模板化代码。在您的第一个示例中,这是空的,因此它不知道 TItem 和 TLIst 应该是哪个类 -
使用模板需要在编译时知道参数的类型,并且需要将它们传递到
< > -
setIndex(list, selectedId);有效吗?模板参数应该从函数参数中推导出来。 -
谢谢你们,我编辑比较了。