Subject: [Boost-bugs] [Boost C++ Libraries] #3204: binary mpl::transform fails to compile with fusion::vector
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2009-06-22 17:18:20
#3204: binary mpl::transform fails to compile with fusion::vector
-------------------------------------+--------------------------------------
Reporter: tegtmeye@⦠| Owner: djowel
Type: Bugs | Status: new
Milestone: Boost 1.40.0 | Component: fusion
Version: Boost 1.39.0 | Severity: Problem
Keywords: |
-------------------------------------+--------------------------------------
Comments from boost-users mailing list:
<quote>
> Trying the code, it seems mpl::(binary)transform is looking for
> Seq::tag which is not a requirement for MPL::Forward Sequence
> which mpl::transform requires (http://tinyurl.com/l6kcb4).
> fusion::vector adheres fully to an MPL::Forward Sequence.
No, the error is caused by the following code in MPL's pair_view
(which is the underlying implementation mechanism for the binary
transform):
typedef typename min<
typename iterator_category<iter1_>::type
, typename iterator_category<iter2_>::type
>::type category_;
That is, as per iterator_category's requirements [1], pair_view
assumes that the iterator_category's result would be model of
MPL's Integral Constant, which does not seem to be the case with
Fusion categories.
[1]
http://www.boost.org/doc/libs/1_39_0/libs/mpl/doc/refmanual/iterator-
categor
y.html
</quote>
The following code fails to compile:
{{{
#include <boost/mpl/transform.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/fusion/include/mpl.hpp>
#include <boost/fusion/container/vector.hpp>
#include <utility>
using namespace boost;
struct my_make_pair {
template<typename T1, typename T2>
struct apply {
typedef std::pair<T1,T2> type;
};
};
int main(int argc, char *argv[])
{
#if 0
typedef mpl::vector<int,long> seq1;
typedef mpl::vector<float,double> seq2;
typedef mpl::vector<std::pair<int,float>,std::pair<long,double> > pairs;
typedef mpl::transform<seq1,seq2,my_make_pair>::type result;
BOOST_MPL_ASSERT(( equal<result,pairs> ));
#endif
typedef fusion::vector<int,long> seq1;
typedef fusion::vector<float,double> seq2;
typedef fusion::vector<std::pair<int,float>,std::pair<long,double> >
pairs;
typedef mpl::transform<seq1,seq2,my_make_pair>::type result;
BOOST_MPL_ASSERT(( equal<result,pairs> ));
return 0;
}
}}}
-- Ticket URL: <https://svn.boost.org/trac/boost/ticket/3204> Boost C++ Libraries <http://www.boost.org/> Boost provides free peer-reviewed portable C++ source libraries.
This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:00 UTC