请检查以下简化示例(提升1.68):
#include <boost/smart_ptr/shared_ptr.hpp>
#include <boost/range.hpp>
#include <vector>
void f(std::vector<boost::shared_ptr<int>>& c) {
using std::advance;
auto it = c.begin();
advance(it, 1);
}
此代码无法在gcc-8和clang-6上编译,并出现相同的错误,对advance()的调用不明确。
这两个候选人:
candidate: ‘constexpr void std::advance(_InputIterator&, _Distance)
[with _InputIterator =
__gnu_cxx::__normal_iterator<boost::shared_ptr<int>*, std::vector<boost::shared_ptr<int> > >; _Distance = int]’
advance(_InputIterator& __i, _Distance __n)
candidate: ‘constexpr void boost::iterators::advance_adl_barrier::advance(InputIterator&, Distance) [with InputIterator =
__gnu_cxx::__normal_iterator<boost::shared_ptr<int>*, std::vector<boost::shared_ptr<int> > >; Distance = int]’
advance(InputIterator& it, Distance n)
boost :: range引入了第二个候选对象,不幸的是,我不能简单地删除它,因为它已被另一个依赖项(boost :: geometry)所包含。
不合格的调用是由另一个库(range-v3)执行的,它是故意利用ADL进行的
这显然是与ADL相关的问题,但是我想念为什么编译器找到了第二个候选对象,因为没有涉及boost :: range类型。