bind1st上的一个老问题与C ++ STL中的men_fun

时间:2012-02-07 17:22:55

标签: c++ stl

一些简单的代码将证明问题:

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功能框架中固有的缺陷? 谢谢!

2 个答案:

答案 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。 似乎情况类似于你的情况。