nested usage of boost::bind in boost::lambda not working

178 views Asked by At

My Following Simple program on boost lambda is spewing out the following error:

maxInMap.cpp:29:71: instantiated from here /usr/include/boost/lambda/detail/function_adaptors.hpp:264:15: error: invalid initialization of reference of type ‘std::vector<int>&’ from expression of type ‘const std::vector<int>’

Please help me in understanding the issue as it would help me in overall Boost Lambda

#include <map>

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

#include <boost/lambda/lambda.hpp>
#include <boost/lambda/if.hpp>
#include <boost/lambda/algorithm.hpp>
#include <boost/lambda/bind.hpp>

using namespace std ;
using namespace boost ;
using namespace boost::lambda ;

int main()
{
    map<int, vector<int> > intVecMap ;
    int vecSizes[] = {3, 6, 2, 9, 5, 8, 1, 7, 10, 4} ;
    for (int i = 0; i < 10; i++) 
        intVecMap[i] = vector<int>(vecSizes[i], i) ;

    map<int, vector<int> >::const_iterator itr =
        max_element(intVecMap.begin(), intVecMap.end(),
                    (bind(&vector<int>::size,
                          bind(&pair<int, vector<int> >::second, _1)) <
                     bind(&vector<int>::size,
                          bind(&pair<int, vector<int> >::second, _2)))) ;
    if (itr == intVecMap.end())
        cout << "Max Element function could not find any max :-(\n" ;
    else 
        cout << "Max Index = "<<(*itr).first<<" Size = "<<(*itr).second.size()<<endl ;
    return 0 ;
}
1

There are 1 answers

1
Jonathan Wakely On

The error is not actually related to Boost.Lambda or Boost.Bind, this is the problem:

                      bind(&pair<int, vector<int> >::second, _2)))) ;

The value_type of map<int, vector<int> > is not pair<int, vector<int>> it is pair<const int, vector<int>>

If you change both occurrences of pair<int, to pair<const int, it should compile.

(The reason a map has a const key type is to prevent you invalidating the map's ordering by modifying an element's key.)