Error: Why 'void*' is not a pointer-to-object type even though the pointer is set to an object?

Error: Why 'void*' is not a pointer-to-object type even though the pointer is set to an object?

我有以下代码 (live on 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;
}

代码产生:

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;
                ^~

在外部库中,定义了一个 union ExternLibraryUnion,我在自己的代码中使用它。我无法解决的问题是 class Masterset 方法。 Master 成员 void* m_union 应该指向存储在成员 Container m_container 中的联合。当我设置 m_union = m_container.get_union() 时,编译器应该能够知道我从 get_union() 方法调用返回 ExternLibraryUnion*。所以我不太明白赋值 m_union->a = i 引起的错误。当然,void* 没有类型,但我给它分配了一个精确类型的指针 ExternLibraryUnion.

假设我不能直接触摸 Container m_container 对象。我需要通过 void* m_union 指针进行赋值。

非常感谢任何帮助!

你需要改变

private:
void* m_union;

private:
ExternLibraryUnion* m_union;

在第 63 行。按照您的代码,您将指针向上转换为 void*,然后,在下一行,编译器无法知道指向的类型。

如果你不能改变类型,你可以static_cast将空指针指向一个 外部图书馆联盟*。然后用它来访问。由于您知道类型,因此 static_cast 可能是 "acceptable"。但无论如何都不是最好的设计。

编译器不知道m_union可能实际上指向什么。你将它声明为 void * 所以编译器相信你,它别无选择。这就是它知道的 all,所以 m_union->a 必须被标记为错误,因为 ->a 在这里对编译器没有意义。

换句话说,除了 RTTI,指针并不 'know' 它们指向什么。编译器只知道指针是如何声明.

不知道还能说什么,真的就这么简单。我不想这么说,但从整体上看代码,它看起来一团糟。谁写的?

[编辑] Jeffrey 所说的确实会解决它,但这不是您所要求的。