try push_back<_1, deref<max_element<_1> > >.
i.e. don't use ::type in an MPL Lambda expression.



That doesn't work either. Below is a full code example as I think it should be from your feedback (I have tried in GCC and MSVC2010):

#include <boost/mpl/vector.hpp>
#include <boost/mpl/push_back.hpp>
#include <boost/mpl/placeholders.hpp>
#include <boost/mpl/for_each.hpp>
#include <boost/mpl/fold.hpp>
#include <boost/mpl/max_element.hpp>
#include <boost/mpl/deref.hpp>
#include <iostream>
#include <typeinfo>


using namespace boost::mpl;
using namespace boost::mpl::placeholders;

typedef vector<int_<0>, int_<3>, int_<2> > v1;

// I want to use max_element on a vector I am in the process of constructing using a fold
typedef fold<v1, vector<int_<0> >, push_back<_1, deref<max_element<_1> > > >::type v2;

struct print_value
{
template <typename data_tpt>
void operator()(data_tpt p)
{
//Uncommenting this is what I would like but fails to compile
//std::cerr << "value: " << data_tpt::value << std::endl;
std::cerr << "value: " << typeid(p).name() << std::endl;
}
};

int main()
{
for_each<v2,_>(print_value());
return 0;
}
 

This produces a compile error in MSVC 2010 and compiles on GCC but produces bad results:

value: N4mpl_4int_ILi0EEE
value: N5boost3mpl5derefINS0_11max_elementIN4mpl_3argILi1EEENS0_4lessINS4_ILin1EEES7_EEEEEE
value: N5boost3mpl5derefINS0_11max_elementIN4mpl_3argILi1EEENS0_4lessINS4_ILin1EEES7_EEEEEE
value: N5boost3mpl5derefINS0_11max_elementIN4mpl_3argILi1EEENS0_4lessINS4_ILin1EEES7_EEEEEE

I expect all to be similar to: N4mpl_4int_ILi0EEE