考虑以下代码
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' 注意:没有构造函数可以采用源类型,或者构造函数重载解析是不明确的
对于解决歧义问题我缺少什么的想法?
答案 0 :(得分:3)
这是有史以来最无益的编译器错误。问题是你想要
func = std::bind([this](my_struct& s) { s.i = 5; }, std::placeholders::_1);
// ^^^^^^^^^^^^^^^^^^^^^
std::bind(f)
表示&#34;给我一个g
,g(/* 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;
};