std :: mem_fun_ref问题:当作为成员函数调用时,作为仿函数被破坏

时间:2011-04-04 20:29:18

标签: c++ stl mem-fun

问题是编译器错误,下面的代码片段。

这是一个非常简单的程序,用随机整数填充列表并递增每个元素。我使用std :: for_each调用函数来递增我的集合中的每个成员并编译所有成员。专注于main()中的for_each。接下来我只是改变for_each来调用List :: increment而不是functor Increment(注意main中注释掉的代码)。对于这个任务,我使用mem_fun_ref,因为我不处理指针集合而是处理类。另外我认为我不需要bind1st或bind2nd。

这是我的编译器错误:

/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c ++ / bits / stl_algo.h:在函数_Function std :: for_each(_InputIterator,_InputIterator,_Function)[with _InputIterator = std: :_List_iterator,_Function = std :: mem_fun1_ref_t]':blahblah.cpp:53:从这里实例化

/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c ++ / bits / stl_algo.h:158:错误:无法匹配(std :: mem_fun1_ref_t)(unsigned int&) “

/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c ++ / bits / stl_function.h:826:注意:候选人是:void std :: mem_fun1_ref_t :: operator()(_ Tp& ,_Arg)const [with _Tp = List,_ Arg = unsigned int&]

#include <list>
#include <string>
#include <algorithm>
#include <functional>
#include <iostream>

static const unsigned int LIST_SIZE = 25;

typedef std::list<unsigned int> List_t;

class List
{
    public:
        List() {};
        ~List() {};
        void push_back(unsigned int in) {m_list.push_back(in);};
        List_t::iterator begin( ) {m_list.begin();}
        List_t::iterator end( ) {m_list.end();};
        void print_list ( ) const
        {
            std::cout << std::endl;
            for (List_t::const_iterator iter = m_list.begin(); iter != m_list.end(); ++iter)
            {
                std::cout << *iter << ' ';
            }
            std::cout << std::endl << std::endl;

        }
        void increment( unsigned int & input)
        {
            ++input;
        }
    private:
        List_t m_list;
};
struct Increment{
    void operator ()(unsigned int &input)
    {
       ++input;
    }
};

int main()
{
    List l;
    for (unsigned int i= 0; i <= LIST_SIZE; i++)
    {
        unsigned int x = rand() % 100;
        l.push_back(x);
    }
    l.print_list(); // pre incremented
    //for_each(l.begin(),l.end(),Increment());
    for_each(l.begin(),l.end(),std::mem_fun_ref(&List::increment));
    l.print_list(); // incremented
    return 1;
}

2 个答案:

答案 0 :(得分:3)

mem_fun_reffor_each一起想要拥有每个单独项目的成员函数,而不是容器类本身。

为什么需要增加成为List的成员?它不在其状态下运行。我会说它作为一个自由函子完全没问题。

答案 1 :(得分:0)

static void increment(unsigned int &input)
{
    ++input;
}

int main()
{
    List l;
    for (unsigned int i= 0; i <= LIST_SIZE; i++)
    {
        unsigned int x = rand() % 100;
        l.push_back(x);
    }
    l.print_list(); // pre incremented
    for_each(l.begin(),l.end(),std::ptr_fun(&increment));
    l.print_list(); // incremented
    return 1;
}