我是VS2013的用户,我经常按如下方式使用初始化,并且它的工作方式很吸引人:
MyClass::MyClass myRoutine(){
std::function<double(double)> oFunc = std::bind(&Myclass::myfunction, this, std::placeholders::_1);
}
MyClass::MyClass myfunction(double & inX){
return 0;
}
我决定升级到VS2015,但是编译器报告错误:
错误C2440:'正在初始化':无法从'std :: _ Binder
&转换>'到'std :: function '
发生了什么事?
答案 0 :(得分:5)
功能签名不匹配:double(double)
与double(double&)
。因此,编译错误。其中之一需要更改,例如:
double MyClass::myfunction(double inX){
return 0;
}
答案 1 :(得分:1)
您的函数尝试通过引用(double &
)引用其参数时,尝试将其赋值给带有按值(double
)签名的函数。
此问题最有可能是由于一致性错误(可能与非const临时MSVC扩展进行了一些怪异的交互)而在VS2013中进行了编译。基本上,这不是有效的C ++代码。 VS2015在标准支持和一致性方面领先于以前的VS(VS2017更是如此),因此该错误代码不再编译。
无论如何,std :: bind几乎完全被lambda淘汰,而VS2010 +应该支持。它们产生更好的代码,更好的警告/错误,更容易编写和调试。
例如,您的代码无法这样重写:
std::function<double(double)> oFunc = [this](double x){ return myfunction(x); };
或者如果您确实想通过引用传递,则这样:
std::function<double(double &)> oFunc = [this](double &x){ return myfunction(x); };
请注意它更短更简单。