
The following trivial use of Boost.Range fails to compile: #include <boost/range/begin.hpp> template<class Rng> void foo(Rng const& rng) { boost::begin(rng); } int main() { char* sz = "hello"; foo( sz ); } With g++, I get: $ g++ -I$BOOST_ROOT test.cpp /cygdrive/c/boost/cvs/boost/boost/range/begin.hpp: In function `typename boost::range_const_iterator<C>::type boost::range_detail::begin(const C&) [with C = char*]': /cygdrive/c/boost/cvs/boost/boost/range/begin.hpp:162: instantiated from `typename boost ::range_const_iterator<C>::type boost::begin(const T&) [with T = char*]' test.cpp:6: instantiated from `void foo(const Rng&) [with Rng = char*]' test.cpp:12: instantiated from here /cygdrive/c/boost/cvs/boost/boost/range/begin.hpp:40: error: request for member `begin' in `c', which is of non-aggregate type `char* const' The attached patch fixes the problem for both boost::begin() and boost::end(). I have verified that the range tests pass with this change. -- Eric Niebler Boost Consulting www.boost-consulting.com Index: begin.hpp =================================================================== RCS file: /cvsroot/boost/boost/boost/range/begin.hpp,v retrieving revision 1.11 diff -b -d -u -r1.11 begin.hpp --- begin.hpp 5 Jan 2005 18:19:30 -0000 1.11 +++ begin.hpp 29 Jan 2005 00:07:13 -0000 @@ -111,20 +111,40 @@ return s; } + inline const char* begin( const char*const& s ) + { + return s; + } + inline char* begin( char*& s ) { return s; } + inline char* begin( char*const& s ) + { + return s; + } + inline const wchar_t* begin( const wchar_t*& s ) { return s; } + inline const wchar_t* begin( const wchar_t*const& s ) + { + return s; + } + inline wchar_t* begin( wchar_t*& s ) { return s; } + + inline wchar_t* begin( wchar_t*const& s ) + { + return s; + } #endif } // namespace 'range_detail' Index: end.hpp =================================================================== RCS file: /cvsroot/boost/boost/boost/range/end.hpp,v retrieving revision 1.14 diff -b -d -u -r1.14 end.hpp --- end.hpp 5 Jan 2005 18:19:31 -0000 1.14 +++ end.hpp 29 Jan 2005 00:07:13 -0000 @@ -111,20 +111,40 @@ return range_detail::str_end( s ); } + inline char* end( char*const& s ) + { + return range_detail::str_end( s ); + } + inline wchar_t* end( wchar_t*& s ) { return range_detail::str_end( s ); } + inline wchar_t* end( wchar_t*const& s ) + { + return range_detail::str_end( s ); + } + inline const char* end( const char*& s ) { return range_detail::str_end( s ); } + inline const char* end( const char*const& s ) + { + return range_detail::str_end( s ); + } + inline const wchar_t* end( const wchar_t*& s ) { return range_detail::str_end( s ); } + + inline const wchar_t* end( const wchar_t*const& s ) + { + return range_detail::str_end( s ); + } #endif } // namespace 'range_detail'