diff --git a/include/boost/range/concepts.hpp b/include/boost/range/concepts.hpp index 722b14f..467858b 100644 --- a/include/boost/range/concepts.hpp +++ b/include/boost/range/concepts.hpp @@ -23,6 +23,7 @@ #include #include #include +#include /*! * \file @@ -260,14 +261,24 @@ namespace boost { struct SinglePassRangeConcept { #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT - typedef BOOST_DEDUCED_TYPENAME range_iterator::type const_iterator; - typedef BOOST_DEDUCED_TYPENAME range_iterator::type iterator; + // A few compilers don't like the rvalue reference T types so just + // remove it. + typedef BOOST_DEDUCED_TYPENAME remove_reference::type Rng; - BOOST_RANGE_CONCEPT_ASSERT((range_detail::SinglePassIteratorConcept)); - BOOST_RANGE_CONCEPT_ASSERT((range_detail::SinglePassIteratorConcept)); + typedef BOOST_DEDUCED_TYPENAME range_iterator< + Rng const + >::type const_iterator; - BOOST_CONCEPT_USAGE(SinglePassRangeConcept) - { + typedef BOOST_DEDUCED_TYPENAME range_iterator::type iterator; + + BOOST_RANGE_CONCEPT_ASSERT(( + range_detail::SinglePassIteratorConcept)); + + BOOST_RANGE_CONCEPT_ASSERT(( + range_detail::SinglePassIteratorConcept)); + + BOOST_CONCEPT_USAGE(SinglePassRangeConcept) + { // This has been modified from assigning to this->i // (where i was a member variable) to improve // compatibility with Boost.Lambda @@ -281,7 +292,7 @@ namespace boost { } private: - void const_constraints(const T& const_range) + void const_constraints(const Rng& const_range) { const_iterator ci1 = boost::begin(const_range); const_iterator ci2 = boost::end(const_range); @@ -294,7 +305,7 @@ namespace boost { // The type of m_range is T* rather than T because it allows // T to be an abstract class. The other obvious alternative of // T& produces a warning on some compilers. - T* m_range; + Rng* m_range; #endif }; @@ -308,11 +319,11 @@ namespace boost { #endif }; - template + template struct WriteableRangeConcept { #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT - typedef BOOST_DEDUCED_TYPENAME range_iterator::type iterator; + typedef BOOST_DEDUCED_TYPENAME range_iterator::type iterator; BOOST_CONCEPT_USAGE(WriteableRangeConcept) { @@ -320,7 +331,7 @@ namespace boost { } private: iterator i; - BOOST_DEDUCED_TYPENAME range_value::type v; + BOOST_DEDUCED_TYPENAME range_value::type v; #endif }; diff --git a/test/iterator_range_drop.cpp b/test/iterator_range_drop.cpp index 3b41041..58ac43c 100644 --- a/test/iterator_range_drop.cpp +++ b/test/iterator_range_drop.cpp @@ -53,7 +53,7 @@ private: return m_it == other.m_it; } - boost::int32_t dereference() const + reference dereference() const { return *m_it; } @@ -97,7 +97,7 @@ private: return m_it == other.m_it; } - boost::int32_t dereference() const + reference dereference() const { return *m_it; }