微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么在不同的命名空间中调用同名函数时会出现“模棱两可”错误?

如何解决为什么在不同的命名空间中调用同名函数时会出现“模棱两可”错误?

我在命名空间 make_heap() 中实现了一个名为 dsa函数。当我尝试调用它和 std::make_heap() 进行比较时出现错误。 GCC 告诉我:

重载'make_heap(dsa::Vector::iterator&,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,i,compare);
    }
}

解决方法

ADL 反击:

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

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

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

创建自己的 dsa::greater 可能是一个临时解决方案,但如果用户使用 make_heap 和迭代器“来自”std(或者 std::vector<int>::iterator(假设它不是指针) ) 或 dsa::vector<std::string>>::iterator),您会遇到同样的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。