一些简单的代码将演示问题:
class Foo {};
struct Bar {
bool foo(const Foo &f) const { return false; }
};
int main() {
Bar bar;
vector<Foo> v;
std::find_if(v.begin(), v.end(), std::bind1st(
std::mem_fun_ref(&Bar::foo), bar));
return 0;
}
现在,对于这段代码,VS2010 c++ 编译器会报错: 错误 C2535: bool std::binder1st<_Fn2>::operator()(const Foo&) const: 已定义或已声明的成员函数
在较早版本的 Visual Studio 上,会多出两个与 reference to reference 问题相关的编译错误。虽然这些问题在 VS2010 中已经消失,但 C2535 仍然存在。
这个问题类似于this one .正如该帖子所建议的那样,我可以使用 std::bind 或 boost 库作为替代方案。它们工作正常,但现在,我想知道在这种情况下是否可以使用旧的 bind1st 样式,或者这个问题更多是 STL 功能框架中固有的缺陷? 谢谢!
最佳答案
这不是 VS 或任何编译器的问题。 mem_fun_ref
返回的类型是mem_fun_ref_t
,它继承自一元函数。该仿函数接受一个参数,该参数必须是成员函数所属的类类型。 mem_fun_ref
不能用于带参数的成员函数。
Binder 已被弃用是有原因的:它们很糟糕。
关于c++ - C++ STL 中关于 bind1st with men_fun 的老问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9180799/