2011-04-04 59 views
0

问题是编译器错误,下面的代码片段。std :: mem_fun_ref问题:当作为函数调用时作为成员函数调用

这是一个非常简单的程序,用随机整数填充列表并增加每个元素。我使用一个函数的std :: for_each来增加我的集合的每个成员,并且全部编译。关注main()中的for_each。接下来,我简单地改变for_each来调用List :: increment而不是函子Increment(注意主注释掉的代码)。对于这个任务,我使用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 =标准:: _ List_iterator,_Function =标准:: mem_fun1_ref_t]':blahblah.cpp:53:从这里

/usr/lib/gcc/i686-pc-cygwin/3.4实例化。 (std :: mem_fun1_ref_t)(unsigned int &)'

/usr/lib/gcc/i686-pc-cygwin/usr/4/include/C++/bits/stl_algo.h:158:error: 3.4.4 /包括/ C++ /比特/ stl_fu nction.h:826:注意:候选是:空隙的std :: mem_fun1_ref_t ::运算符()(_ TP &,_Arg)const的[与_TP =列表,_Arg =无符号整型&]

#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; 
} 
+0

问题是? – 2011-04-04 20:31:57

+0

如何更改上面的for_each调用以便在没有上面列出的错误的情况下进行编译。 – 2011-04-04 20:40:36

回答

3

mem_fun_ref结合与for_each希望有一个成员函数每个单独的项目,而不是容器类本身。

为什么你需要增加成为List的成员?它不会在其状态下运行。我会说它作为一个自由函数是完全正确的。

+0

这是示例代码。我*要*想在国家进行操作,但我没有为我的例子设计。 – 2011-04-04 20:39:26

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; 
}