不能为没有对象的成员函数调用对象的shared_ptr向量

时间:2014-03-31 22:56:36

标签: c++ boost lambda shared-ptr boost-bind

#include <boost/ref.hpp>
//#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
#include <boost/mem_fn.hpp>

using namespace std;
using namespace boost::lambda;

class Base {
  public:
  Base () {}
  bool toBeRemoved() const {
    return true;
  }
};

class status : public Base {
  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';
  }
  std::string getStatus() const {
    return ok_ ? "1" : "0";
  }
};

class some_class {
 public:
 int test() {
   std::vector<boost::shared_ptr<status> > s_statuses = getStatus(); //some func 
   std::set<string> s;
   std::transform(s_statuses.begin(), s_statuses.end(), std::inserter(s, s.begin()), boost::lambda::bind(boost::mem_fn(&status::getStatus), boost::ref(*_1)));

// approach #2
//   std::transform(s_statuses.begin(), s_statuses.end(), std::inserter(s, s.begin()), boost::lambda::bind(boost::mem_fn(&status::getStatus), boost::ref(*_1), _1));

// approach #3
//   std::transform(s_statuses.begin(), s_statuses.end(), std::inserter(s, s.begin()), boost::bind(&status::getStatus), _1));

   std::copy(s.begin(), s.end(), ostream_iterator<string>(std::cout, "-"));
   std::cout << endl;
   return 0;
 }
}

对于上述所有方法,我在包含绑定调用的行上收到错误“可以调用无对象的成员函数”。我也尝试过使用boost :: lambda :: bind和boost :: bind。虽然这种使用绑定的方式在定义对象时起作用,例如在main函数中。我假设我在这里犯了一些愚蠢的错误,但我无法弄清楚为什么这些方法都有效,或者可能是这种情况根本不是正确的做法。 有人可以帮我解决一下如何正确使用boost绑定存储在stl容器中的类的非静态成员吗​​?

谢谢,

1 个答案:

答案 0 :(得分:1)

您应该只需要使用boost::mem_fn。 (注意,如果可用,您也可以使用std::mem_fn。)

std::transform(s_statuses.begin(), s_statuses.end(), std::inserter(s, s.begin()), std::mem_fn(&status::getStatus));