c++ - C++ STL 中关于 bind1st with men_fun 的老问题

标签 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<_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/

相关文章:

C++ OpenCV 捕获 easycap usb cam

c++ - 这个 RAII 独占资源检查对象/管理器组合线程安全吗?

c++ - 使用 C++ 从 bios 获取 Assets 标签和序列号

c++ - STL std::find()C++

c++ - 用于 Legendre 多项式的 gsl_sf_legendre_sphPlm_array() 替代方案

c++ - 包装一行预处理器 C++

c++ - 为什么迭代器需要默认构造

android - 为什么 native 线程在应用程序处于后台时表现不同?

c++ - 从函数返回迭代器给我一个奇怪的错误

c++ - 寻找 vector 中的最大元组