http://groups-beta.google.com/group/comp.lang.c++.moderated/browse_thread/thread/3c449572456c8592
The test program: #include <vector> int distance(std::vector<int> v1, std::vector<int> v2) { return v1.size() - v2.size(); } int main() { std::vector<int> v1(3), v2(1); int d = distance(v1, v2); return 0; } The error message from 3.4.4: D:/mingw-gcc3.4/bin/../lib/gcc/mingw32/3.4.4/../../../../include/c++/3.4.4/bits/stl_iterator_base_types.h: In instantiation of `std::iterator_traits<std::vector<int, std::allocator<int> > >': test1.cpp:11: instantiated from here D:/mingw-gcc3.4/bin/../lib/gcc/mingw32/3.4.4/../../../../include/c++/3.4.4/bits/stl_iterator_base_types.h:129: error: no type named `iterator_category' in `class std::vector<int, std::allocator<int> >' It has been confirmed that the problem is not that Koenig lookup takes priority over the local overload, etc. It is that the failure to deduce the return type of the instantiation of std::distance<>() caused the abortion of candidate building. If the necessary typedef is provided, the local version of distance will be correctly selected. It might be arguable whether SFINAE should be applied here (the C++ standard is not quite clear on this). But I do not think it the purpose of the standard to let something in the std namespace affect local name resolution. Maybe you gurus here can judge better? This problem occurs from 2.95.3 to 3.4.4. I believe it is platform-independent. -- Summary: Error in Koenig Lookup causes overload resolution failure Product: gcc Version: 3.4.4 Status: UNCONFIRMED Severity: normal Priority: P2 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: adah at netstd dot com CC: gcc-bugs at gcc dot gnu dot org GCC build triplet: i386-pc-mingw32 GCC host triplet: i386-pc-mingw32 GCC target triplet: i386-pc-mingw32 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23213