#include <functional>
#include <iostream>
class Foo{
void print(std::function<void (void)> f){
f();
std::cout << "!";
}
void sayHello(){
std::cout << "Hello";
}
public:
void tell(){
print(sayHello);
}
};
int main(){
auto foo = Foo();
foo.tell(); // 'Foo::sayHello': function call missing argument list; use '&Foo::sayHello' to create a pointer to member
}
我收到错误C3867: 'Foo::sayHello': function call missing argument list; use '&Foo::sayHello' to create a pointer to member
。如果我使用&Foo::sayHello
,那么我会得到一堆模板错误。
我做错了什么?
答案 0 :(得分:4)
sayHello
是一个非静态成员函数,因此它有一个隐含的第一个参数,this
指针。让代码工作的最简单方法是使用一个捕获this
指针的lambda表达式。
void tell(){
print([this]{sayHello();});
}
另一个选项是std::bind
void tell(){
print(std::bind(&Foo::sayHello, this));
}
答案 1 :(得分:3)
您希望将成员函数作为参数传递,但必须在对象实例上调用成员函数。
可能的解决方案如下:
void tell(){
print(std::bind(&Foo::sayHello, this));
}
答案 2 :(得分:2)
成员函数有一个附加参数:this
指针。你只是假设函数的声明没有
void (void)
bind()函数可以帮助您将指针绑定到它并返回适合std::function
包装器的对象
#include <functional>
#include <iostream>
class Foo{
void print(std::function<void (void)> f){
f();
std::cout << "!";
}
void sayHello(){
std::cout << "Hello";
}
public:
void tell(){
print(std::bind(&Foo::sayHello, this));
}
};
int main(){
auto foo = Foo();
foo.tell();
}