#1814 closed Bugs (fixed)
foreach broken by is_char_array mpl assertion.
Reported by: | Owned by: | Eric Niebler | |
---|---|---|---|
Milestone: | To Be Determined | Component: | foreach |
Version: | Boost 1.35.0 | Severity: | Regression |
Keywords: | Cc: |
Description
please consider following testcase that works fine with boost-1.34:
struct IV { typedef std::vector< int > C; typedef C::const_iterator const_iterator; virtual const_iterator begin() const = 0; virtual const_iterator end() const = 0; }; void test_foreach( IV const& iv ) { BOOST_FOREACH( int i, iv ) { } }
with boost-1.35 i got an error:
boost/foreach.hpp(357) : error C2259: 'IV' : cannot instantiate abstract class due to following members: 'IV::const_iterator IV::begin(void) const' : is abstract (...) 'IV::const_iterator IV::end(void) const' : is abstract (...) boost/foreach.hpp(357) : see reference to class template instantiation 'boost::foreach_detail_::foreach_iterator<T,C>::IS_THIS_AN_ARRAY_OR_A_NULL_TERMINATED_STRING23' being compiled (...)
Change History (3)
comment:1 by , 15 years ago
comment:2 by , 15 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
comment:3 by , 15 years ago
This problem had already been fixed in trunk, but the fix didn't make it into the release branch in time for 1.35. I have merged the fix into the release branch in case there is a 1.35.1 release.
If you would like to make the change locally, the simple fix is to change this:
BOOST_MPL_ASSERT_MSG( (!is_char_array<T>::value), IS_THIS_AN_ARRAY_OR_A_NULL_TERMINATED_STRING, (T) );
to this:
BOOST_MPL_ASSERT_MSG( (!is_char_array<T>::value), IS_THIS_AN_ARRAY_OR_A_NULL_TERMINATED_STRING, (T&) );
Note the (T&)
at the end, rather than the (T)
.
Note:
See TracTickets
for help on using tickets.
afaics the problem is in the BOOST_MPL_ASSERT_MSG invocation. the last parameter T leads to an abstract type instantitation.