2011-06-03 94 views
1

嗨 我想传递一个成员函数的回调函数。我知道一个函数指针和一个成员函数指针是不同的,并试图创建一个包装并使用静态转换和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

'dSpaceCollide'的签名是什么? – Xeo 2011-06-03 10:03:28

+2

“我明白函数指针和成员函数指针是不同的,并且尝试过静态转换”。不知怎的,我觉得你不明白。演员阵容不是魔术棒,会让你的问题消失。 – MSalters 2011-06-03 10:05:43

+0

是的,没有dSpaceCollide的签名,我只能猜测。也许在dSpaceCollide的调用中接受的函数指针中没有userPtr参数?或没有数据参数? – daramarak 2011-06-03 10:12:35

回答

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 
+0

感谢Xeo,很好的解释 – Fred 2011-06-03 13:17:52

0

我要在这里猜测,并承担typedef void dNearCallback(void *data, dGeomID o1, dGeomID o2)。也就是说,没有void* userPtr传递给您的回调。当您尝试使用StaticNearCallback时,类型系统会捕获此信息,其中确实为预期为void* userPtr

这个问题的根本可能是一个更根本的误解。为什么您的StaticNearCallback两个无类型void*指针?你在做什么void* dataNearCallback?记住,C++方法有一个(键入的)this指针,所以你很少需要一个无类型的void* data

0

看看boost::function(也可能是boost::bind)。他们通常可以让你的生活变得更容易。

+0

他们不会,如果你回调期望一个简单的函数指针。 – Xeo 2011-06-03 10:42:11

+0

@Xeo。嗯,是。我正在假设他也负责调用类。 – Roddy 2011-06-03 11:13:06