为什么在不同命名空间中调用同名函数时出现"歧义"错误?



我在名称空间dsa中实现了一个名为make_heap()的函数。当我试图调用它和CCD_ 3进行比较时,我遇到了错误。GCC告诉我:

调用重载的'make_heap(dsa::Vector::迭代器&,dsa::Vector::iterator&、std::greater('是不明确的

代码如下,有什么建议吗?

template<typename _Random_It>
void make_heap(_Random_It first, _Random_It last)
{
// get true value_type from the iterators
using value_type = typename std::iterator_traits<_Random_It>::value_type;
make_heap(first, last, std::greater<value_type>());   // << error here
}
template<typename _Random_It, typename _Comp>
void make_heap(_Random_It first, _Random_It last, _Comp compare)
{
if(first + 2 >= last)
{
return ;
}
for(size_t i = (last - first) / 2; i > 0; i--)
{
__heapify(first, last, i, compare);
}
}
ADL反击:

make_heap(first, last, std::greater<value_type>());具有位于namespace std中的参数std::greater,因此非限定名称make_heap也会查找namespace std

"解决方案";是进行限定名称查找(或使用不冲突的名称(:

dsa::make_heap(first, last, std::greater<value_type>());

创建自己的dsa::greater可能是一个临时的解决方案,但如果用户使用带有迭代器的make_heap;从";std(或者std::vector<int>::iterator(假设它不是指针(,或者dsa::vector<std::string>>::iterator(,都会有同样的问题。

相关内容

  • 没有找到相关文章

最新更新