class A
{
public:
A();
void Func1(int,int);
void Func2(long,long);
private:
...
};
<implementation here>
主要:
std::vector<std::function<void(void)>> fl;
A a;
fl.push_back(std::bind(&a.Func1, 1,1));
给出错误: ISO C ++禁止获取绑定成员函数的地址以形成指向成员函数的指针
解?
编辑:更改了“A a();”到“A a;”。这里没有构造函数:P
编辑: 选择Praetorian的答案作为答案,因为它解决了问题。 DietmarKühl's也是一个很好的解决方案,但不是问题的实际答案。 要公平:D
答案 0 :(得分:3)
Func1
是一个非静态成员函数,因此必须在A
的实例上调用它,您需要bind
作为第一个参数( this
指针)。此外,在创建指向成员函数的指针时,语法为&ClassName::MemFuncName
。
所以你需要
fl.push_back(std::bind(&A::Func1, &a, 1, 1));
确保在调用绑定函数之前a
的生命周期没有结束。
答案 1 :(得分:1)
两个问题。首先,
A a();
是一个函数声明。你需要
A a;
然后,
fl.push_back(std::bind(&A::Func1, &a, 1,1));
答案 2 :(得分:1)
您也可以不使用std::bind()
:
std::vector<std::function<void(void)>> fl;
A a{};
fl.push_back([&](){ a.Func1(1, 1); });
代码在堆栈上显示引用a
。当函数对象没有比a
更长时,这没关系。如果无法保证,您可能希望将&
替换为复制对象的=
。顺便说一下,从()
到{}
的微妙变化导致代码将a
声明为A
类型的对象,而不是作为不带参数的函数并返回{{1} }。
答案 3 :(得分:0)
#include <iostream>
#include <vector>
#include <functional>
using namespace std;
class A
{
public:
A() {}
void Func1(int,int) {}
void Func2(long,long) {}
};
int main()
{
std::vector<std::function<void(void)>> fl;
A a;
fl.push_back(std::bind(&A::Func1, &a, 1,1));
return 0;
}
你需要提供两件事(至少):1)指向成员函数的指针2)隐含的&#34; this&#34;指针,即您要调用方法的对象。
然后您可以添加要绑定的参数。
另请注意,遗憾的是,您无法创建&#34; A&#34;与&#34; A a();&#34;这是最令人烦恼的解析&#34;。正确的方法是&#34; A a;&#34;或&#34; A a {};&#34;