c++ - 不能为对象的 shared_ptr 的 vector 调用没有对象的成员函数

标签 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;
 }
}

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

谢谢,

最佳答案

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

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

关于c++ - 不能为对象的 shared_ptr 的 vector 调用没有对象的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22773777/

相关文章:

python - lambda 如何与 reduce 一起工作

c# - 有没有办法同步运行异步 lambda?

go - 使用无服务器框架的 AWS Codebuild Golang Lambda

c++ - 防止对 std::unique_ptr 的不安全取消引用

c++ - 模板声明说明

c++ - boost.random buggy 警告 - 这是什么意思?

c++ - 指向 char 数组的指针的索引

c++ - 使用 boost::asio::async_write 和 boost::process::async_pipe 多次写入子进程的标准输入

c++ - 将 boost::asio::async_read 与标准输入一起使用?

c++ - 如何使用具有强制性最小元素数量的boost spirit list运算符?