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 Master
的 set
方法。 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 所说的确实会解决它,但这不是您所要求的。
我有以下代码 (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 Master
的 set
方法。 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 所说的确实会解决它,但这不是您所要求的。