2011-04-04 91 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; 
}