您好 我试图传递一个成员函数回调。我知道函数指针和成员函数指针是不同的,并试图创建一个包装器并使用静态转换和void指针。不幸的是我错过了一些东西,因为我的代码在编译时产生错误
Error 16 error C2664: 'dSpaceCollide' : cannot convert parameter 3 from 'int (__cdecl *)(void *,void *,dGeomID,dGeomID)' to 'dNearCallback (__cdecl *)'
我的代码.....
class ODEPhysics
头文件
void NearCallback (void* data, dGeomID o1, dGeomID o2);
static int StaticNearCallback(void* data, void* userPtr, dGeomID o1, dGeomID o2);
.cpp file
void ODEPhysics::NearCallback (void* data, dGeomID o1, dGeomID o2){.........}
void ODEPhysics::StaticNearCallback(void* data , void* userPtr, dGeomID o1, dGeomID o2)
{
static_cast<ODEPhysics*>(userPtr)->NearCallback( data, o1, o2);
}
dSpaceCollide (Space, 0, &ODEPhysics::StaticNearCallback);
如果有人能够澄清我做错了什么以及为什么会非常感激。
佛瑞德
答案 0 :(得分:1)
问题最有可能来自您所展示的dSpaceCollide
只想要一个
typedef void (*dNearCallback)(void*,dGeomID,dGeomID)
回调,即具有单个void*
用户数据指针和两个dGeomID
s作为参数的函数。 void*
是您传递给dSpaceCollide
的任何数据。
假设dSpaceCollide
定义如下:
void dSpaceCollide(CSpace s, void* user_data, dNearCallback cb){
// somewhere inside the code it will call your callback:
cb(user_data, some_other, params);
// ...
}
然后您可以将回调更改为:
void NearCallback(dGeomID o1, dGeomID o2);
static void StaticNearCallback(void* data, dGeomID o1, dGeomID o2){
ODEPhysics* self = static_cast<ODEPhysics*>(data);
self->NearCallback(o1, o2);
}
不再需要成员函数中的void* data
指针,因为data
仅与静态回调相关:
// assuming you call this inside of your ODEPhysics class
dSpaceCollide(Space, this, &ODEPhysics::StaticNearCallback);
// pass this as user_data
答案 1 :(得分:0)
我将在这里猜测,并假设typedef void dNearCallback(void *data, dGeomID o1, dGeomID o2)
。也就是说,没有void* userPtr
传递给你的回调。当您尝试使用{em> 期望StaticNearCallback
的{{1}}时,类型系统会捕获此信息。
这个问题的根源可能是一个更根本的误解。为什么您的void* userPtr
有两个无类型StaticNearCallback
指针?您在void*
中使用void* data
做了什么?请记住,C ++方法有一个(类型化的)NearCallback
指针,所以你很少需要一个无类型的this
。
答案 2 :(得分:0)
查看boost::function(也许boost::bind)。它们通常可以让您的生活更轻松。