一些简单的代码将证明问题:
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&lt; _Fn2&gt; :: operator()(const Foo&amp;)const: 成员函数已经定义了声明的
在早期版本的Visual Studio中,会出现两个与参考问题相关的编译错误。虽然VS2010已经出现了这些问题,但C2535仍然存在。
此问题与this one类似。正如那篇文章所建议的那样,我可以使用std :: bind或boost库作为替代品。它们工作正常,但是现在,我想知道在这种情况下是否可以使用旧的bind1st样式,或者这个问题更多是STL功能框架中固有的缺陷? 谢谢!
答案 0 :(得分:3)
这不是VS或任何编译器的问题。 mem_fun_ref
返回的类型是mem_fun_ref_t
,它继承了一元函数。该仿函数接受一个参数,该参数必须是成员函数所属的类类型。 mem_fun_ref
不适用于带参数的成员函数。
粘合剂已经被弃用了一个原因:他们很糟糕。
答案 1 :(得分:0)
请查看Using bind1st for a method that takes argument by reference。 似乎情况类似于你的情况。