Проблема std :: mem_fun_ref: работает как функтор, если вызывается как функция-член - PullRequest
0 голосов
/ 05 апреля 2011

Проблема в ошибках компилятора с фрагментом кода ниже.

Вот очень простая программа для заполнения списка случайными целыми числами и увеличения каждого элемента.Я использую вызов std :: for_each для функтора, чтобы увеличить каждый элемент моей коллекции и все скомпилированные.Сосредоточьтесь на for_each в main ().Затем я просто изменяю for_each для вызова List :: increment, а не функтора 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) [с _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 [с _Tp = списком, _Arg = без знака 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 ]

3 голосов
/ 05 апреля 2011

mem_fun_ref в сочетании с for_each хочет иметь функцию-член каждого отдельного элемента , а не самого класса контейнера.

Зачем вам нужен прирост, чтобы стать членом List? Он не работает в своем состоянии. Я бы сказал, что это прекрасно, как свободный функтор.

0 голосов
/ 05 апреля 2011
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;
}
...