std::function std::bind 具有 lambda 重载歧义
std::function std::bind with lambda overload ambiguity
考虑以下代码
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 上,我收到以下错误:
error C2440: 'initializing': 无法从 'std::_Binder>' 转换为 'std::function'
注意:没有构造函数可以采用源类型,或者构造函数重载解析不明确
关于我缺少什么来解决歧义有什么想法吗?
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;
};
这是有史以来最无用的编译器错误。问题是你想要
func = std::bind([this](my_struct& s) { s.i = 5; }, std::placeholders::_1);
// ^^^^^^^^^^^^^^^^^^^^^
std::bind(f)
意思是“给我一个 g
这样 g(/* anything */)
就是 f()
。
如果你想传递参数,你需要使用占位符。
(我假设您的真实代码做的事情比这更复杂,因为在您显示的代码中不需要 bind
或捕获 this
。)
考虑以下代码
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 上,我收到以下错误:
error C2440: 'initializing': 无法从 'std::_Binder>' 转换为 'std::function' 注意:没有构造函数可以采用源类型,或者构造函数重载解析不明确
关于我缺少什么来解决歧义有什么想法吗?
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;
};
这是有史以来最无用的编译器错误。问题是你想要
func = std::bind([this](my_struct& s) { s.i = 5; }, std::placeholders::_1);
// ^^^^^^^^^^^^^^^^^^^^^
std::bind(f)
意思是“给我一个 g
这样 g(/* anything */)
就是 f()
。
如果你想传递参数,你需要使用占位符。
(我假设您的真实代码做的事情比这更复杂,因为在您显示的代码中不需要 bind
或捕获 this
。)