【问题标题】:Error: ‘void*’ is not a pointer-to-object type错误:‘void*’不是指向对象的指针类型
【发布时间】:2012-11-24 12:59:15
【问题描述】:

我正在尝试访问动态库中的函数,该函数实例化了 Person 的一个实例,并将指向它的指针作为 void 指针返回。然后程序必须使用 reinterpret_cast 将 void 指针转换为 Person。但是,我收到一个错误:error: ‘void*’ is not a pointer-to-object type.

代码如下:

库中的函数:

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 {
   //...

谢谢!

【问题讨论】:

    标签: c++ object pointers dynamic shared-libraries


    【解决方案1】:

    有问题的行是:

    void* person_vp = (*loadPerson)();
    

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

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

    编辑:

    为了更好的可读性,可以这样拆分演员表:

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

    【讨论】:

    • 很好的答案,但我会为函数指针添加一个变量,以便过程更清晰。
    • @JonathanGrynspan 谢谢,扩大了答案。
    • @Agnew 我现在在 NetBeans 中遇到错误:RUN FAILED (exit value 1)。根据this 教程,我需要调用像(*loadPerson)() 这样的函数,因为它返回值,即分配给person_vp 指针。我在这里错过了什么?
    • @edin.gacan 从未将 NetBeans 与 C++ 一起使用,但我猜消息可能是您的 main() 返回了 1。那可能吗?此外,您可能应该检查 dlsym() 返回一个非空指针。
    • @Angew Nope,main() 返回 0dlsym() 也返回值。
    猜你喜欢
    • 2019-05-04
    • 2011-12-18
    • 2013-10-24
    • 2017-04-22
    • 1970-01-01
    • 2013-05-18
    • 2011-12-18
    • 2020-08-30
    • 1970-01-01
    相关资源
    最近更新 更多