从'`A**`'到"无效**"的转换无效

Invalid conversion from '`A**`' to '`void**`

本文关键字:无效 转换      更新时间:2023-10-16
#include <iostream>
using namespace std;
class A
{
    public:
        A(int x){ a = x;}
        ~A();
    private:
        int a;
};
int main()
{
    A* a = new A(10);
    void** p;
    p = &a;
    return 0;
}
使用g++ (GCC) 4.1.2 20080704编译后,我得到以下错误:

test.cpp: In function ' int main() ':
test.cpp:17:错误:从' A** '到' void** '无效转换

一颗星太多了。void*已经可以保存任何指针,不需要强制转换:

int main()
{
    A* a = new A(10);
    void* p;
    p = &a;
    return 0;
}

这适用于多个级别,甚至:

int main()
{
    A* a = new A(10);
    A** aa = &a;
    A*** aaa = &aa;
    void* p = &aaa;
}

因为A***是指向A**的指针。

您需要使用reinterpret_cast:

这纯粹是一个编译器指令,指示编译器将expression的位序列(对象表示)视为new_type类型。

在本例中,您的expression将为&a,类型为A**, new_type类型为void**:

p = reinterpret_cast<void**>(&a);

这里要小心,因为c++并不是真的喜欢void类型,你的代码很可能会违反类型别名规则。

在我看来,转换为void**是可能应该使用模板的指示。没有看到你的代码,我不能保证,但是,如果你想在评论中给我更多的信息,也许我可以帮助。

如果不能隐式转换,则不能将一种类型(A**)的值赋给另一种类型(void**)的变量。您需要显式地将值从一种类型转换为另一种类型:

class A
{
    public:
        A(int x){ a = x;}
        ~A();
    private:
        int a;
};
int main()
{
    A* a = new A(10);
    void** p;
    // use `reinterpret_cast'
    p = reinterpret_cast<void**>(&a);
    // C-style cast works but it is a bad practice in C++
    p = (void**)&a;
    return 0;
}