2010-10-18 95 views
4

如果我有一个类(模仿一些STL的容器)是这样的:C++来调用成员函数中的for_each在成员容器项目


class Elem { 
public: 
    void prepare(); // do something on *this 
    // ... 

}; 

class Selector { 
public: 
    typedef vector<Elem *> container_type; 
    typedef container_type::iterator iterator; 

    iterator begin() { return cont_.begin(); } 
    iterator end() { return cont_.end(); } 

    void check_all(); 

private: 
    prepare_elem(Elem *p); // do something on 'p' 
    container_type cont_; 

}; 

如果我要呼吁所有的元素作好准备()在“cont_”,我可以做 以下功能:


void Selector::check_all() { 
    for_each(cont_.begin(), cont_.end(), mem_fun(&Elem::prepare)); 

} 

我的问题是,如果我想打电话给选择:: prepare_elem()用于 在“cont_”的所有元素是什么?我最初的做法不会编译:


void Selector::check_all() { 
    for_each(cont_.begin(), cont_.end(), 
      mem_fun(&Selector::prepare_elem)); 

} 

第二条本办法也未能:


void Selector::check_all() { 
    for_each(cont_.begin(), cont_.end(), 
      bind1st(mem_fun(&Selector::prepare_elem), this)); 
} 

反正是有使用std :: for_each的()调用 选择:: prepare_elem()?

如果有办法,我想知道没有提升的解决方案。

+2

你得到的错误信息是什么? FTR,这个问题看起来像解决了类似的问题。 http://stackoverflow.com/questions/1762781/mem-fun-and-bind1st-problem – jwismar 2010-10-18 05:56:30

+1

嗯,我没有仔细查看你的最后一次尝试。这应该是有效的,看看它在这里编译(错误来自链接器):http://ideone.com/xD5b3 – Potatoswatter 2010-10-18 06:06:51

+0

你提供'prepare_elem'的实现吗?另外,没有问题。 – Naveen 2010-10-18 06:11:30

回答

1

如果你不想使用boost :: bind - 使用std :: tr1 :: bind。