错误:为什么'void*'不是指针对象类型,即使指针设置为对象?

Dum*_*ior 0 c++ void-pointers unions

我有以下代码(住在Coliru):

// untouchable extern library .hpp  file

typedef union ExternLibraryUnion
{
    int a;
    float b;
}ExternLibraryUnion;

// my code

#include <iostream>

class Container{
    public:
    Container() : m_union(NULL) {};

    ~Container(){
        if(m_union){
            delete m_union;
        }
    }

    void init(){
        m_union = new ExternLibraryUnion();
    }

    ExternLibraryUnion* get_union(){
        return m_union;
    }

private:
    ExternLibraryUnion* m_union;
};


class Master{
    public:
    Master() : m_union(NULL) {
        m_container.init();    
    };

    ~Master(){
        if(m_union){
            delete static_cast<ExternLibraryUnion*>(m_union);
        }
    }

    void load(){

    }

    void set(int i){
        m_union = m_container.get_union();
        m_union->a = i;
    }

    void* get_union(){
        return m_union;
    }

private:
    void* m_union;
    Container m_container;
};

class Worker{
    public:
    Worker() : m_extern_library_union(NULL) {};

    ~Worker(){
        if (m_extern_library_union){
            delete m_extern_library_union;
        }
    }

    void load(Master& master){
        m_extern_library_union = reinterpret_cast<ExternLibraryUnion*>(master.get_union());
    }

    int get_int(){
        return m_extern_library_union->a;
    }


private:
    ExternLibraryUnion* m_extern_library_union;
};

int main()
{
    Master master;
    master.set(3);

    Worker worker;
    worker.load(master);

    std::cout << worker.get_int() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

代码产生:

main.cpp: In member function 'void Master::set(int)':
main.cpp:55:16: error: 'void*' is not a pointer-to-object type
         m_union->a = i;
                ^~
Run Code Online (Sandbox Code Playgroud)

在extern库中,union ExternLibraryUnion定义了一个我在自己的代码中使用的库.我的问题,我无法理解,是在set课堂上的方法Master.该Master成员void* m_union应指向存储在构件内部的工会Container m_container.在我设置的时候m_union = m_container.get_union(),编译器应该能够知道我ExternLibraryUnion*get_union()方法调用中得到了回报.所以我并不完全是因为作业而产生的错误m_union->a = i.当然,a void*没有类型,但我为它指定了精确类型的指针ExternLibraryUnion.

我们也说我不能Container m_container直接触摸对象.我需要通过void* m_union指针进行分配.

任何帮助都非常感谢!

Pau*_*ers 5

编译器有不知道什么m_union可能实际上在被人指指点点.你宣称它是一个void *编译器相信你,它别无选择.而这一切也都知道,所以m_union->a必须被标记为错误,因为->a这里已经没有任何意义的编译器.

换句话说,抛开RTTI,指针不知道他们指的是什么.编译器只知道指针的声明方式.

我不知道还能说什么,它真的很简单.我不喜欢这样说,但从整体上看代码,它看起来像是一团糟.谁写的?

[编辑]杰弗里说的确实会解决它,但那不是你问的问题.