为什么在不同命名空间中调用同名函数时出现 "ambigous" 错误?
why did I get "ambigous" error when invoking same-named function in different namespace?
我在命名空间 dsa
中实现了一个名为 make_heap()
的函数。当我尝试调用它和 std::make_heap()
进行比较时出现错误。 GCC 告诉我:
call of overloaded 'make_heap(dsa::Vector::iterator&, dsa::Vector::iterator&, std::greater)' is ambiguous
代码如下,有什么建议吗?
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>());
的参数 std::greater
在 namespace std
中,因此不合格的名称 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
),你会遇到同样的问题。
我在命名空间 dsa
中实现了一个名为 make_heap()
的函数。当我尝试调用它和 std::make_heap()
进行比较时出现错误。 GCC 告诉我:
call of overloaded 'make_heap(dsa::Vector::iterator&, dsa::Vector::iterator&, std::greater)' is ambiguous
代码如下,有什么建议吗?
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>());
的参数 std::greater
在 namespace std
中,因此不合格的名称 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
),你会遇到同样的问题。