OVerload函数调用问题



>我有 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
}

我正在尝试以以下方式调用函数AreSame-

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

现在,有趣的是,我的原始项目和新项目映射类型,但总是调用 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{});

最新更新