c++ - 错误: ‘void*’ is not a pointer-to-object type

标签 c++ object pointers dynamic shared-libraries

我正在尝试从动态库访问函数,该函数实例化 Person 的实例,并将指向它的指针作为 void 指针返回。然后,程序必须使用reinterpret_cast 将void 指针强制转换为Person。但是,我收到一个错误:错误:‘void*’不是指向对象类型的指针。

这是代码:

库中的函数:

void* loadPerson (void) {
    return reinterpret_cast<void*>(new Person);
}

main.cpp:

void* loadPerson = dlsym(lib_handle, "loadPerson");
void* person_vp = (*loadPerson)();
Person* person = reinterpret_cast<Person*>(person_vp);

if (dlerror() != NULL) 
   cout<<"Library init error."<<endl;  
else {
   //...

谢谢!

最佳答案

有问题的行是:

void* person_vp = (*loadPerson)();

您正在取消引用 void*。你需要这个:

void* person_vp = (*reinterpret_cast<void* (*)()>(loadPerson))();

编辑:

为了更好的可读性,可以像这样分割 Actor :

typedef void* VoidFunc();
VoidFunc* loadPerson_func = reinterpret_cast<VoidFunc*>(loadPerson);
void* person_vp = (*loadPerson_func)();

关于c++ - 错误: ‘void*’ is not a pointer-to-object type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13744617/

相关文章:

matlab - 将 MATLAB 对象转换为结构体?

pointers - 为什么我的自定义错误类型会导致特定模式的错误?

c - 防止c中的文件中的字符被写出

c++ - 从 QtConcurrent 线程计算中获取项目序列号

c++ - 简单的十六进制/ float 转换

c++ - 隐式数组大小调整和 C++ 崩溃

c++ - 删除注册表项下的所有值而不删除子项

xcode - Swift 1.2 - 列表类型未声明

javascript - 使用 Javascript 对象和函数时字符串长度无效

c++ - 由于 LARGEADDRESSAWARE 检测指针算术