私はこの問題に数回噛まれたので、同僚もそうです。コンパイルするとき
#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
}
... 2番目の検索をコンパイルするときに、VS9コンパイラが失敗します。これはSTest2
、ブースト名前空間で定義された型から継承し、コンパイラがを検出するADLを試行するようにトリガーするためboost::algorithm::find(RangeT& Input, const FinderT& Finder)
です。
find(…)
明らかな解決策は、呼び出しの前に「 」を付けること::
ですが、なぜこれが必要なのですか?グローバル名前空間には完全に有効な一致があるのに、なぜ引数依存のルックアップを呼び出すのですか?誰かがここで理論的根拠を説明できますか?