我有一个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
有人可以解释我做错了产生这个错误吗?
答案 0 :(得分:24)
在将void *
转换为具体类型之前,您将取消引用arguments vars = *(arguments *) (args);
。你需要反过来做这件事:
*
此顺序很重要,因为编译器不知道如何将args
应用于void *
((arguments *)
并且无法解除引用)。你的{{1}}告诉它该怎么做,但为时已晚,因为已经发生了取消引用。
答案 1 :(得分:6)
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;
}
答案 2 :(得分:3)
您将*
放在错误的位置。所以你试图取消引用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";
答案 3 :(得分:1)
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;
}
答案 4 :(得分:0)
* args表示“对象(值)args指向”。因此,它不能作为指向对象(参数)的指针。这就是它给出错误的原因
答案 5 :(得分:0)
上面的问题是您试图引用C或C ++中不允许的空指针。
但是,这仍然有效:
#include <iostream>
using namespace std;
int main()
{
int b=10;
void *a=&b;
int *ptr=(int*)a;
cout<<*ptr;;
}
在将void指针强制转换为int *指针之后,我们可以引用int *指针。