std :: function std :: bind with lambda overload ambiguity

时间:2017-05-25 21:21:47

标签: c++ function lambda std

考虑以下代码

class my_class {
public:
struct my_struct {
   int i;
};
std::function<void(my_struct&)> func;
my_class() {
   func = std::bind([this](my_struct& s) { s.i = 5; });
}
};

在VS 2017上,我收到以下错误:

错误C2440:'初始化':无法转换为'std :: _ Binder&gt;' 'std :: function' 注意:没有构造函数可以采用源类型,或者构造函数重载解析是不明确的

对于解决歧义问题我缺少什么的想法?

2 个答案:

答案 0 :(得分:3)

这是有史以来最无益的编译器错误。问题是你想要

func = std::bind([this](my_struct& s) { s.i = 5; }, std::placeholders::_1);
//                                                  ^^^^^^^^^^^^^^^^^^^^^

std::bind(f)表示&#34;给我一个gg(/* anything */)f()

如果要通过参数传递,则需要使用占位符。

(我认为您的真实代码比这更复杂,因为您不需要bind或在您已经展示的代码中捕获this。)

答案 1 :(得分:2)

std::bind在C ++ 11中或多或少已经过时了。只需使用lambda。

class my_class
{
public:
  struct my_struct {
    int i;
  };
  my_class()
  : func ([](my_struct& s) { s.i = 5; }) {}
private:
  std::function<void(my_struct&)> func;
};