diff --git a/include/boost/range/iterator_range_core.hpp b/include/boost/range/iterator_range_core.hpp index 8108947..2fbeb68 100644 --- a/include/boost/range/iterator_range_core.hpp +++ b/include/boost/range/iterator_range_core.hpp @@ -442,8 +442,8 @@ public: > base_type; template - struct is_compatible_range - : is_convertible< + struct is_compatible_range_ + : is_convertible< BOOST_DEDUCED_TYPENAME mpl::eval_if< has_range_iterator, range_iterator, @@ -454,6 +454,20 @@ public: { }; + template + struct is_compatible_range + : mpl::and_< + mpl::not_< + is_convertible< + Source, + BOOST_DEDUCED_TYPENAME base_type::iterator + > + >, + is_compatible_range_ + > + { + }; + protected: typedef iterator_range_detail::iterator_range_impl impl; diff --git a/test/iterator_range.cpp b/test/iterator_range.cpp index 168eb22..7fa8c74 100644 --- a/test/iterator_range.cpp +++ b/test/iterator_range.cpp @@ -266,6 +266,20 @@ inline void test_advance() BOOST_CHECK_EQUAL(r3.advance_end(-1).size(), 1u); } +struct ptr_iterator + : boost::iterator_adaptor +{ + ptr_iterator() = default; + ptr_iterator(int *p) : boost::iterator_adaptor(p) {} +private: + typedef void iterator; // To throw off the SFINAE mechanism in iterator_range +}; + +void test_sfinae() +{ + boost::iterator_range r(ptr_iterator(0), ptr_iterator(0)); +} + boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] ) { boost::unit_test::test_suite* test = BOOST_TEST_SUITE( "Range Test Suite" );