[英]C++. Error: void is not a pointer-to-object type
我有一个C ++程序:
struct arguments
{
int a, b, c;
arguments(): a(3), b(6), c(9) {}
};
class test_class{
public:
void *member_func(void *args){
arguments vars = (arguments *) (*args); //error: void is not a
//pointer-to-object type
std::cout << "\n" << vars.a << "\t" << vars.b << "\t" << vars.c << "\n";
}
};
在编译时它会抛出一个错误:
error: ‘void*’ is not a pointer-to-object type
有人可以解释我做错了产生这个错误吗?
在将其转换为具体类型之前,您将取消引用void *
。 你需要反过来做:
arguments vars = *(arguments *) (args);
这个顺序很重要,因为编译器不知道如何将*
应用于args
(这是一个void *
并且无法解除引用)。 你的(arguments *)
告诉它该怎么做,但为时已晚,因为已经发生了取消引用。
Bare bones示例重现上述错误:
#include <iostream>
using namespace std;
int main() {
int myint = 9; //good
void *pointer_to_void; //good
pointer_to_void = &myint; //good
cout << *pointer_to_void; //error: 'void*' is not a pointer-to-object type
}
上面的代码是错误的,因为它试图取消引用指向void的指针。 这是不允许的。
现在运行下面的代码,如果您理解为什么以下代码运行而上面的代码没有运行,那么您将能够更好地了解底层的内容。
#include <iostream>
using namespace std;
int main() {
int myint = 9;
void *pointer_to_void;
int *pointer_to_int;
pointer_to_void = &myint;
pointer_to_int = (int *) pointer_to_void;
cout << *pointer_to_int; //prints '9'
return 0;
}
你有*
在错误的地方。 所以你正试图取消引用void*
。 试试这个:
arguments vars = *(arguments *) (args);
std::cout << "\n" << vars.a << "\t" << vars.b << "\t" << vars.c << "\n";
或者,您可以这样做:(这也避免了复制构造函数 - 如评论中所述)
arguments *vars = (arguments *) (args);
std::cout << "\n" << vars->a << "\t" << vars->b << "\t" << vars->c << "\n";
bdonlan所说的问题是“在施法前取消引用void*
”。
我认为这个例子会有所帮助:
#include <iostream>
using namespace std;
int main()
{
void *sad;
int s = 23;
float d = 5.8;
sad = &s;
cout << *(int*) sad;//outputs 23//wrong: cout << *sad ;//wrong: cout << (int*) *sad;
sad = &d;
cout << *(float *) sad;//outputs 5.8//wrong: cout << *sad ;//wrong: cout << (float*) *sad;
return 0;
}
上面的问题是你试图遵循一个在C或C ++中不允许的void指针。
但是,这仍然有效:
#include <iostream>
using namespace std;
int main()
{
int b=10;
void *a=&b;
int *ptr=(int*)a;
cout<<*ptr;;
}
在将void指针转换为int *指针后,我们可以使用int *指针。
* args表示“对象(值)args指向”。 因此,它不能作为指向对象(参数)的指针。 这就是它给出错误的原因
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.