我在Linux上建立了一个VRPN客户端。基于这个:http://www.vrgeeks.org/vrpn/tutorial---use-vrpn
下面是一些代码:
vrpn_Analog_Remote * analog = NULL;
vrpn_Button_Remote * button = NULL;
vrpn_Tracker_Remote * tracker = NULL;
// Things happen...
analog = new vrpn_Analog_Remote("pathToAnalog");
analog->register_change_handler(NULL, handleAnalog);
button = new vrpn_Button_Remote("pathToButton");
button->register_change_handler(NULL, handleButton);
tracker = new vrpn_Tracker_Remote("pathToTracker");
tracker->register_change_handler(NULL, handleTracker);
以下是此代码中引用的回调:
void handleAnalog(void * userData, const vrpn_ANALOGCB a) {
// Do stuff...
}
void handleButton(void * userData, const vrpn_BUTTONCB b) {
// Do stuff...
}
void handleTracker(void * userData, const vrpn_TRACKERCB t) {
// Do stuff...
}
这里定义了所有这些对VRPN的引用:
https://github.com/vrpn/vrpn/blob/master/vrpn_Analog.h#L168
https://github.com/vrpn/vrpn/blob/master/vrpn_Button.h#L225
https://github.com/vrpn/vrpn/blob/master/vrpn_Tracker.h#L284
这些程序在Linux上编译时甚至没有任何警告,实际上可以使用。一切如期而至。这里的所有类型似乎都满足编译器g++。
但是在Windows上,无论我使用Visual Studio 2015还是MinGW的g++,我都会在前两次回调注册时得到这个:
invalid conversion from 'void (*)(void*, vrpn_ANALOGCB) {aka void (*)(void*, _vrpn_ANALOGCB)}' to 'vrpn_ANALOGCHANGEHANDLER {aka
void (__attribute__((__stdcall__)) *)(void*, _vrpn_ANALOGCB)}' [-fpermissive]
invalid conversion from 'void (*)(void*, vrpn_BUTTONCB) {aka void (*)(void*, _vrpn_BUTTONCB)}' to 'vrpn_BUTTONCHANGEHANDLER {aka
void (__attribute__((__stdcall__)) *)(void*, _vrpn_BUTTONCB)}' [-fpermissive]
最后一个错误是:
call of overloaded 'register_change_handler(NULL, void (&)(void*, vrpn_TRACKERCB))' is
ambiguous
既然我输入了这个,我想也许VRPN在Windows上的编译方式不同,这就是为什么编译器现在对我的代码有问题。但我不知道该怎么办。
最佳答案
尝试这样声明回调:
void VRPN_CALLBACK handleAnalog(void * userData, const vrpn_ANALOGCB a) {
// Do stuff...
}
对于linux,
VRPN_CALLBACK
定义是空的,因此您没有注意到那里有任何问题。对于windows,VRPN库开发人员决定,他们期望一个符合__stdcall
调用约定的回调。因此,您必须相应地声明您的函数,最简单的+可移植的方法是使用它们提供的相同的VRPN_CALLBACK
定义。这方面的线索来自于你在github的代码链接:
[vrpn_Analog.h]
typedef void(VRPN_CALLBACK *vrpn_ANALOGCHANGEHANDLER)(void *userdata,
const vrpn_ANALOGCB info);
回调定义如下:
[vrpn_Configure.h]
#ifdef _WIN32 // [ ...
#define VRPN_CALLBACK __stdcall
#else // ... ] WIN32 [
#define VRPN_CALLBACK
#endif // ] not WIN32