C ++。错误:void不是指向对象的指针类型

时间:2011-10-31 03:30:49

标签: c++ casting void-pointers abstract-data-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

有人可以解释我做错了产生这个错误吗?

6 个答案:

答案 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 *指针。