无法 std::bind 成员函数
Unable to std::bind member function
我写了以下内容class:
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);
}
}
我得到了完全相同的错误。
您忘记了 std::bind
的第四个参数,这是您要在其上调用非静态成员函数的实例。由于它不对(不存在的)class 成员数据进行操作,我认为它应该是 static
,在这种情况下你不需要实例。
也就是说,如果你想绑定到一个非静态成员函数,你可以这样做:
auto test = std::bind(&SomeClass::test_function, this, std::placeholders::_1,
std::placeholders::_2, std::placeholders::_3);
// you can also bind *this
或(如果没有绑定参数,这没有意义 - 绑定 a
、b
、c
):
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
诸如此类。
当您使用 bind
捕获指向成员函数的指针时,生成的 bind
对象的第一个参数必须是指向合适类型对象的内容。因为你要绑定到 SomeClass::test_function
你需要一个 SomeClass
类型的对象来应用它,所以 test
的第一个参数必须是 SomeClass
类型的对象或者指向 SomeClass
类型对象的指针。对于初学者,尝试这样称呼它:
test(this, b, c);
您需要传递对 SomeClass::test_function
将 运行 的对象的引用(很可能 this
)。 Cppreference 描述了 std::bind
的工作原理。
另一种选择是使 SomeClass::test_function
成为静态成员函数,不需要将实例传递给绑定。
当对成员函数使用 std::bind
时,this
指针需要具有特征(即它需要访问 class 的实例)。要么作为 bind
的参数捕获,要么在稍后调用绑定类型时作为参数捕获。
例如;
auto test = std::bind(&SomeClass::test_function, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
test(a, b, c);
我写了以下内容class:
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);
}
}
我得到了完全相同的错误。
您忘记了 std::bind
的第四个参数,这是您要在其上调用非静态成员函数的实例。由于它不对(不存在的)class 成员数据进行操作,我认为它应该是 static
,在这种情况下你不需要实例。
也就是说,如果你想绑定到一个非静态成员函数,你可以这样做:
auto test = std::bind(&SomeClass::test_function, this, std::placeholders::_1,
std::placeholders::_2, std::placeholders::_3);
// you can also bind *this
或(如果没有绑定参数,这没有意义 - 绑定 a
、b
、c
):
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
诸如此类。
当您使用 bind
捕获指向成员函数的指针时,生成的 bind
对象的第一个参数必须是指向合适类型对象的内容。因为你要绑定到 SomeClass::test_function
你需要一个 SomeClass
类型的对象来应用它,所以 test
的第一个参数必须是 SomeClass
类型的对象或者指向 SomeClass
类型对象的指针。对于初学者,尝试这样称呼它:
test(this, b, c);
您需要传递对 SomeClass::test_function
将 运行 的对象的引用(很可能 this
)。 Cppreference 描述了 std::bind
的工作原理。
另一种选择是使 SomeClass::test_function
成为静态成员函数,不需要将实例传递给绑定。
当对成员函数使用 std::bind
时,this
指针需要具有特征(即它需要访问 class 的实例)。要么作为 bind
的参数捕获,要么在稍后调用绑定类型时作为参数捕获。
例如;
auto test = std::bind(&SomeClass::test_function, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
test(a, b, c);