OVerloaded проблема вызова функции - PullRequest
0 голосов
/ 09 мая 2018

У меня есть 2 перегруженные функции скажем - func1 и func2 -

Func1 is -

template<typename T1, typename T2> bool AreIdentical(const std::pair<T1, T2> 
&lhs, const std::pair<T1, T2> &rhs)
{
  //some code
}

Func2 is -

 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 имеют тип map , но всегда Func1 вызывается, что принимает параметр пара тип вместо Func2 .

Кто-нибудь знает, почему так происходит?

1 Ответ

0 голосов
/ 09 мая 2018

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