Opened 15 years ago

Closed 15 years ago

Last modified 15 years ago

#1814 closed Bugs (fixed)

foreach broken by is_char_array mpl assertion.

Reported by: pluto@… 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)

in reply to:  description comment:1 by pluto@…, 15 years ago

afaics the problem is in the BOOST_MPL_ASSERT_MSG invocation. the last parameter T leads to an abstract type instantitation.

comment:2 by Eric Niebler, 15 years ago

Resolution: fixed
Status: newclosed

(In [44182]) work with abstract classes, fixes #1814

comment:3 by Eric Niebler, 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.