我正在尝试从代码的另一部分返回的 C 指针重新创建一个 UserEvent 对象:
uintptr_t get_event_ptr(); // returns cl_event pointer to user event, comes from pyopencl
uintptr_t evt_ptr = get_event_ptr();
C++中的事件具有以下构造函数:
Event (const cl_event &event, bool retainObject=false)
但是用户事件没有这样的构造函数。他们所拥有的只是:
UserEvent (const Context &context, cl_int *err=NULL)
UserEvent ()
我尝试过静态强制转换,重新解释转换和动态转换,但无济于事:
dynamic_cast
cl::UserEvent* ue = dynamic_cast<cl::UserEvent*> (new cl::Event(*((const cl_event*) evt_ptr)));
error: 'cl::Event' is not polymorphic
static_cast
cl::UserEvent* ue = static_cast<cl::UserEvent*> (new cl::Event(*((const cl_event*) evt_ptr)));
ue->setStatus(CL_COMPLETE);
Segmentation fault: 11
reinterpret_cast
cl::UserEvent* ue = reinterpret_cast<cl::UserEvent*> (new cl::Event(*((const cl_event*) evt_ptr)));
ue->setStatus(CL_COMPLETE);
Segmentation fault: 11
using parent constructor
cl::UserEvent* ue = new cl::UserEvent((const cl_event&)(*((const cl_event*) evt_ptr)));
error: no matching constructor for initialization of 'cl::UserEvent'
如何从 C 指针重新创建用户事件?
cl_event是typedef'd作为指针,而不是opencl抽象类型。因此,应将其设置为 AS evt_ptr,而不是 *evt_ptr。
cl::UserEvent* ue = static_cast<cl::UserEvent*> (new cl::Event((cl_event) evt_ptr));
ue->setStatus(CL_COMPLETE);
工作正常