0

問題は、以下のコード スニペットのコンパイラ エラーです。

以下は、ランダムな整数でリストを埋め、各要素をインクリメントする非常に単純なプログラムです。ファンクターへの std::for_each 呼び出しを使用して、コレクションの各メンバーをインクリメントし、すべてコンパイルします。main() の for_each に注目してください。次に、ファンクタ Increment ではなく、List::increment を呼び出すように for_each を単純に変更します (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;
}
4

2 に答える 2

3

mem_fun_refと組み合わせて、コンテナクラス自体ではなく、個々のアイテムfor_eachのメンバー関数を持ちたいと考えています。

のメンバーになるためにインクリメントが必要なのはなぜListですか? その状態では動作しません。フリーファンクターとしてはまったく問題ないと思います。

于 2011-04-04T20:34:04.300 に答える