【问题标题】:An old issue on bind1st with men_fun in C++ STL在 C++ STL 中使用 men_fun 的 bind1st 上的一个老问题
【发布时间】:2012-02-07 17:22:55
【问题描述】:

一些简单的代码将演示这个问题:

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 中,还会出现两个与引用问题相关的编译错误。虽然这些问题在 VS2010 中已经消失,但 C2535 仍然存在。

这个问题类似于this one。正如那篇文章所建议的,我可以使用 std::bind 或 boost 库作为替代方案。它们工作得很好,但是现在,我想知道在这种情况下是否可以使用旧的 bind1st 样式,或者这个问题更多的是 STL 功能框架中固有的缺陷? 谢谢!

【问题讨论】:

    标签: c++ stl


    【解决方案1】:

    这不是 VS 或任何编译器的问题。 mem_fun_ref 返回的类型是 mem_fun_ref_t,它继承自一元函数。这个函子接受一个参数,该参数必须是成员函数所属的类类型。 mem_fun_ref 不能用于带参数的成员函数。

    不推荐使用活页夹是有原因的:它们很烂。

    【讨论】:

    • 我认为这不是真的。 mem_fun_ref 对接受一个参数的成员函数有重载。它的返回类型是const_mem_fun1_ref_t&lt;_Result, _Ty, _Arg&gt;,它是binary_function 的子类型。对于 VS2010,它们在头文件 中定义
    • @weidi 你可以在[deprecated.member.pointer.adaptors]中找到D8.2.2中const_mem_fun_ref_t的定义。您可能正在查看 MSVC 扩展。我在 MSDN 上找不到任何文档(甚至没有标题)。
    • this 是 MSDN 文档吗?对不起,如果我误解了。我真的不太了解各种 c++ 文档,也不知道 D8.2.2 指的是什么。您能否分享提到弃用适配器的链接?
    【解决方案2】:

    请查看Using bind1st for a method that takes argument by reference。 好像和你的情况差不多。

    【讨论】:

    • 谢谢。除了转向 C++11 或 boost 之外,该帖子没有提供解决方案,这似乎支持了我的观点,即 bind1st 的设计可能存在固有的错误。
    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2011-06-01
    • 1970-01-01
    • 2017-02-11
    • 2011-01-10
    • 2013-08-19
    相关资源
    最近更新 更多