我已经被这个问题咬过几次了,我的同事也是如此。编译时
#include <deque>
#include <boost/algorithm/string/find.hpp>
#include <boost/operators.hpp>
template< class Rng, class T >
typename boost::range_iterator<Rng>::type find( Rng& rng, T const& t ) {
return std::find( boost::begin(rng), boost::end(rng), t );
}
struct STest {
bool operator==(STest const& test) const { return true; }
};
struct STest2 : boost::equality_comparable<STest2> {
bool operator==(STest2 const& test) const { return true; }
};
void main() {
std::deque<STest> deq;
find( deq, STest() ); // works
find( deq, STest2() ); // C2668: 'find' : ambiguous call to overloaded function
}
...编译第二个查找时 VS9 编译器失败。这是因为STest2
继承自 boost 命名空间中定义的类型,这会触发编译器尝试 ADL,从而找到boost::algorithm::find(RangeT& Input, const FinderT& Finder)
.
一个明显的解决方案是在调用前find(…)
加上“ ::
”,但为什么这是必要的?全局命名空间中有一个完全有效的匹配,那么为什么要调用 Argument-Dependent Lookup 呢?有人可以在这里解释理由吗?