我在Eclipse中使用Borland C ++编译器时遇到问题,我想将一个成员函数的地址传递给另一个类的构造函数,这是第一类的朋友
PCB::PCB(Thread *t, long stack, int time, void (*method)())
我正在使用方法查找FP_SEG
和FP_OFF
,但是当我写
Thread::Thread (StackSize stackSize, Time timeSlice){
myPCB = new PCB(this, stackSize, timeSlice, run);
}
这是我一直在收到的错误:
在函数Thread :: Thread(unsigned long,unsigned int)中找不到'PCB :: PCB(Thread * const,unsigned long,unsigned int,void)'的匹配项
答案 0 :(得分:4)
尽管成员函数调用看起来像是常规函数调用,但两者并不相同,因为将this
指针传递给被调用函数会涉及编译器技巧。当您从另一个成员函数调用成员函数时,C ++会为您填写this
指针。这就是为什么成员函数与常规函数不兼容,只有静态函数。
如果需要将函数传递给未编写的API,则需要传递常规函数。否则,请考虑更改代码以取代std::function
,因为它与成员函数兼容。
有时,第三方C风格的API支持为调用的“上下文”传递额外的参数。如果您的API也支持void*
,您可以编写一个常规函数,将一个void指针强制转换回类的实例,并在该实例上调用成员函数。