>我有 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());
您可以通过更改迭代器重载来"修复"此问题,以仅接受其值类型具有成员first
和second
的任何迭代器:
template <typename Iter>
auto AreIdentical(Iter itOrig, Iter itNew)
-> decltype((*itOrig).first, (*itOrig).second, bool{});