遇到 'for_each' is not a member of 'std' 的问题

来源:互联网 发布:js设置单选框选中的值 编辑:程序博客网 时间:2024/05/16 10:12

       今天学Boost库时候用到 标准库的 for_each , 但是编译总是出错,提示:

        error: 'for_each' is not a member of 'std' 或者  for_each was not declared in this scope

   这是因为缺少头文件 #include <algorithm>,还有不要忘记using namespace std; 或者用std::for_each。

   在http://ubuntuforums.org/showthread.php?t=965086的4楼找到的答案。


顺便提一下for_each用法和boost::bind调用成员函数的优点:

#include <iostream>#include <boost/bind.hpp>#include <vector>#include <algorithm>class status{    std::string name_;    bool ok_;public:    status(const std::string& name):name_(name),ok_(true) {}    void break_it()    {        ok_=false;    }    bool is_broken() const    {        return ok_;    }    void report() const    {        std::cout << name_ << " is " <<                  (ok_ ? "working nominally":"terribly broken") << '\n';    }};int main(int argc, char** argv){    std::vector<status> statuses;    statuses.push_back(status("status 1"));    statuses.push_back(status("status 2"));    statuses.push_back(status("status 3"));    statuses.push_back(status("status 4"));    statuses[1].break_it();    statuses[2].break_it();    std::for_each(        statuses.begin(),        statuses.end(),    /// std::mem_fun_ref(&status::report)        boost::bind(&status::report, _1)                  );    return 0;}    

    这样就逐一调用了vector型statuses中每个status类的report成员函数,也许

这和用std::mem_fun_ref没有什么区别,但是当你改用指针时候就不同了,需要用

std::mem_fum而不是mem_fum_ref:

    std::vector statuses;    statuses.push_back(new status("status 1"));    statuses.push_back(new status("status 2"));    statuses.push_back(new status("status 3"));    statuses.push_back(new status("status 4"));    statuses[1]->break_it();    statuses[2]->break_it();    std::for_each(        p_statuses.begin(),       p_statuses.end(), ///   std::mem_fun(&status::report)      boost::bind(&status::reprot, _1)    );
    但是如果用boost::bind就不必担心这些了,语法是不变的。


注:代码源自《Beyond the C++ Standard Library: An Introduction to Boost》Library9.