[英]OVerloaded function calling issue
我有2個重載的函數說-func1和func2-
Func1是-
template<typename T1, typename T2> bool AreIdentical(const std::pair<T1, T2>
&lhs, const std::pair<T1, T2> &rhs)
{
//some code
}
Func2是-
template<typename T> bool AreIdentical(typename std::map<int,
std::vector<T>>::iterator itOrig,
typename std::map<int, std::vector<T>>::iterator itNew)
{
//some code
}
我試圖以以下方式調用功能AreIdentical-
int main()
{
std::map<int, std::vector<int>> orgitem;
std::map<int, std::vector<int>> newitem;
newitem[0];
orgitem[0];
AreIdentical(*orgitem.begin(), *newitem.begin());
return 0;
}
現在,有趣的是,我的origitem和的newitem是地圖類型,但始終FUNC1獲取調用這需要對參數類型,而不是FUNC2。
有人知道為什么會這樣嗎?
orgitem.begin()
是一個迭代器。 但是*orgitem.begin()
是迭代器指向的對象,它是std::pair<const int, std::vector<int>>
。
如果你有
AreIdentical(orgitem.begin(), newitem.begin());
如果沒有解引用*
運算符,則將無法調用pair
重載。
但實際上它也不起作用,因為在第二次重載中,參數T
不在可推論的上下文中。 調用它的唯一方法是:
AreIdentical<int>(orgitem.begin(), newitem.begin());
您可以通過更改迭代器重載以僅接受其值類型具有first
和second
成員的任何迭代器來“修復”此問題:
template <typename Iter>
auto AreIdentical(Iter itOrig, Iter itNew)
-> decltype((*itOrig).first, (*itOrig).second, bool{});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.