Не может вызвать функцию-член без объекта для вектора shared_ptr объекта

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

Для всех подходов, описанных выше, я получаю сообщение об ошибке "могу вызвать функцию-член без объекта" в строке, содержащей вызов bind. Я попытался использовать boost::lambda::bind и boost::bind, а также. Хотя этот способ использования связывания работает, если объекты определены, например, в основной функции. Я предполагаю, что я делаю здесь какую-то глупую ошибку, но я не могу понять, почему все эти подходы работают, или это может быть случай, когда это совсем не тот способ. Может кто-нибудь помочь мне решить эту проблему, как правильно использовать boost bind для нестатического члена класса, который хранится в контейнерах stl?

Спасибо,

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));
Другие вопросы по тегам