【问题标题】:Unable to std::bind member function无法 std::bind 成员函数
【发布时间】:2025-11-29 08:20:02
【问题描述】:

我写了以下课程:

class SomeClass {
private:
    void test_function(int a, size_t & b, const int & c) {
        b = a + reinterpret_cast<size_t>(&c);
    }
public:
    SomeClass() {
        int a = 17;
        size_t b = 0;
        int c = 42;
        auto test = std::bind(&SomeClass::test_function, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
        test(a, b, c);
    }
}

就其本身而言,这段代码在 IDE (Visual Studio 2015) 中看起来不错,但是当我尝试编译它时,出现以下错误:

Error   C2893   Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...)'    Basic Server    C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\type_traits  1441    
Error   C2672   'std::invoke': no matching overloaded function found    Basic Server    C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\type_traits  1441    

我做错了什么?

编辑:我也写了这个版本:

class SomeClass {
private:
    void test_function(int a, size_t & b, const int & c) {
        b = a + reinterpret_cast<size_t>(&c);
    }
public:
    SomeClass() {
        int a = 17;
        size_t b = 0;
        int c = 42;
        auto test = std::bind(&SomeClass::test_function, a, std::placeholders::_1, std::placeholders::_2);
        test(b, c);
    }
}

我得到完全相同的错误。

【问题讨论】:

  • lambda 版本:auto test = [this](int a, size_t&amp; b, const int&amp; c) { this-&gt;test_function(a, b, c);}

标签: c++ c++11 stdbind


【解决方案1】:

您忘记了std::bind 的第四个参数,这是您要调用非静态成员函数的实例。由于它不对(不存在的)类成员数据进行操作,我认为它应该是static,在这种情况下您不需要实例。

话虽如此,如果你想绑定到一个非静态成员函数,你可以这样做:

auto test = std::bind(&SomeClass::test_function, this, std::placeholders::_1,
                      std::placeholders::_2, std::placeholders::_3);
// you can also bind *this

或者(如果没有绑定参数,这没有意义 - 绑定abc,如果你愿意):

auto test = std::bind(&SomeClass::test_function,
                      std::placeholders::_1, std::placeholders::_2,
                      std::placeholders::_3, std::placeholders::_4);
test(this, a, b, c); // you can also pass a reference

诸如此类。

【讨论】:

  • 也可以将函数设为静态,根本不需要实例。
  • @callyalater 在我的特定场景中将其设为静态不是一个选项,但很高兴知道。
【解决方案2】:

std::bind 用于成员函数时,this 指针需要具有特征(即它需要访问类的实例)。要么作为bind 的参数捕获,要么在稍后调用绑定类型时作为参数捕获。

例如;

auto test = std::bind(&SomeClass::test_function, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
test(a, b, c);

【讨论】:

    【解决方案3】:

    您需要传入对SomeClass::test_function 将运行的对象的引用(很可能是this)。 Cppreference 描述了 std::bind 的工作原理。

    另一种选择是使SomeClass::test_function 成为静态成员函数,不需要将实例传递给绑定。

    【讨论】:

      【解决方案4】:

      当您使用bind 捕获指向成员函数的指针时,生成的bind 对象的第一个参数必须是引用合适类型的对象的东西。由于您要绑定到SomeClass::test_function,因此您需要一个SomeClass 类型的对象来应用它,所以test 的第一个参数必须是SomeClass 类型的对象或指向@ 类型的对象的指针987654327@。对于初学者,请尝试这样称呼它:

      test(this, b, c);
      

      【讨论】: