簡體   English   中英

OVerloaded函數調用問題

[英]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());

您可以通過更改迭代器重載以僅接受其值類型具有firstsecond成員的任何迭代器來“修復”此問題:

template <typename Iter>
auto AreIdentical(Iter itOrig, Iter itNew)
    -> decltype((*itOrig).first, (*itOrig).second, bool{});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM