Boost logo

Boost Users :

Subject: Re: [Boost-users] [boost-users][tuple] Tuple::get<0> as std::mem_fun_ref
From: Miklós Tóth (spiralfuzet_at_[hidden])
Date: 2013-08-29 05:20:46


Hi! Any updates on this? M.

2013/8/14 Miklós Tóth <spiralfuzet_at_[hidden]>

> Hi!
>
> I have a problem with std::mem_fun_ref and boost::tuple. Here is my code:
> I have small LevelSetter class. It makes a level vector indexed by a
> transform_iterator value.
>
> template <typename LevelType>
> class LevelSetter {
> private:
> int nmb_of_elements;
> public:
> LevelSetter(int nmb_of_elements_) : nmb_of_elements(nmb_of_elements_) {}
>
> template <typename TrRange>
> std::vector<LevelType> set(TrRange range) {
> typedef typename TrRange::first_type TrIter;
> std::vector<LevelType> levels(nmb_of_elements);
> for (TrIter it = range.first; it != range.second; ++it) {
> levels[*it] = 0.0;
> }
> // much more complicated code
> return levels;
> }
> };
>
> Let's call it:
>
> class MemFunRefTest
> {
> private:
>
> typedef float Scalar;
> typedef boost::tuple<int, Scalar> Tuple;
> typedef std::vector<Tuple> Fwd;
> typedef Fwd::iterator FwdIter;
> typedef std::pair<FwdIter, FwdIter> FwdRange;
>
> Fwd elements;
>
> public:
> MemFunRefTest() {
> elements.push_back(Tuple(0, 400.0));
> elements.push_back(Tuple(1, 120.0));
> elements.push_back(Tuple(2, 150.0));
> }
>
> void fun() {
>
> FwdRange element_range = std::make_pair(elements.begin(), elements.end());
>
> LevelSetter<Scalar> setter(elements.size());
> setter.set(std::make_pair(
> boost::make_transform_iterator(
> element_range.first,
> std::mem_fun_ref(&Tuple::get<0>)
> ),
> boost::make_transform_iterator(
> element_range.second,
> std::mem_fun_ref(&Tuple::get<0>)
> )
> )
> );
> }
> };
>
> When I try to compile i get:
>
> error: call of overloaded 'mem_fun_ref(<unresolved overloaded function type>)' is ambiguous
> candidates are:
> c:\mingw-4.6\bin\..\lib\gcc\i686-pc-mingw32\4.6.1\..\..\..\..\include\c++\4.6.1\bits\stl_function.h:697: std::mem_fun_ref_t<_Ret, _Tp> std::mem_fun_ref(_Ret (_Tp::*)()) [with _Ret = int&, _Tp = boost::tuples::cons<int, boost::tuples::cons<float, boost::tuples::null_type> >]
> c:\mingw-4.6\bin\..\lib\gcc\i686-pc-mingw32\4.6.1\..\..\..\..\include\c++\4.6.1\bits\stl_function.h:702: std::const_mem_fun_ref_t<_Ret, _Tp> std::mem_fun_ref(_Ret (_Tp::*)()const) [with _Ret = const int&, _Tp = boost::tuples::cons<int, boost::tuples::cons<float, boost::tuples::null_type> >]
>
> What am I missing?
>
> Thanks, Miklos
>
>
>



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net