我的问题类似于this。 'Karrek SB的答案实际上对我有所帮助。 我有这些课程:
Base.h:
class Base{
public:
Base(){}
virtual ~Base(){}
virtual void init() = 0;
};
A1.h:
#include <iostream>
#include "Base.h"
using namespace std;
class A1 : public Base{
public:
A1(){}
virtual ~A1(){};
virtual void init(){
cout << "A1::init() called" << endl;
}
void f1(){
cout << "Im in A1::f1" << endl;
}
void f2(int val){
cout << "Im in A1::f2 with val: " << val << endl;
}
};
我有另一个类应该能够存储任何类型和数量的args的通用成员函数。该课程看起来像这样:
MFholder.h:
#include <functional>
#include <deque>
using namespace std;
class MFHolder{
public:
MFHolder(){};
~MFHolder(){};
template<typename T, typename R, typename ... Args>
R addMF(T & obj, R (T::*pf)(Args ...), Args&& ... args){
mfp.push_back(function<void()>(bind(pf, &obj, forward<Args>(args) ...)));
}
void runTasks(){
while(!mfp.empty()){
auto task = mfp.front();
mfp.pop_front();
task();
}
}
private:
deque< function<void()> > mfp;
};
现在我想从main向MFHolder添加一些成员函数,如下所示: main.cpp中:
#include "A1.h"
#include "MFHolder.h"
int main(){
MFHolder mfh;
A1 a1Obj;
//A2 a2Obj; //this should also work
int val = 42;
//mfh.addMF(a1Obj, &A1::f1); //this should also work
mfh.addMF(a1Obj, &A1::f2, val);
//add some more function calls here...
//run all the tasks
mfh.runTasks();
return 0;
}
编译代码时出现以下错误。
没有用于调用
的匹配函数'MFHolder::addMF(A1&, void (A1::*)(int), int&)'
候选人是:
template<class T, class R, class ... Args> R MFHolder::addMF(T&, R (T::*)(Args ...), Args&& ...)
提前thx! :)
答案 0 :(得分:1)
要么改变Args&amp;&amp;对Args&amp;在addMF的定义中,或在调用它时将val更改为move(val)。