繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM