C++. Error: void is not a pointer-to-object type

51,271

Solution 1

You are dereferencing the void * before casting it to a concrete type. You need to do it the other way around:

arguments vars = *(arguments *) (args);

This order is important, because the compiler doesn't know how to apply * to args (which is a void * and can't be dereferenced). Your (arguments *) tells it what to do, but it's too late, because the dereference has already occurred.

Solution 2

Bare bones example to reproduce the above error:

#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
}

The above code is wrong because it is trying to dereference a pointer to a void. That's not allowed.

Now run the next code below, If you understand why the following code runs and the above code does not, you will be better equipped to understand what is going on under the hood.

#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;
}

Solution 3

You have the * in the wrong place. So you're trying dereference the void*. Try this instead:

arguments vars = *(arguments *) (args);
std::cout << "\n" << vars.a << "\t" << vars.b << "\t" << vars.c << "\n";

Alternatively, you can do this: (which also avoids the copy-constructor - as mentioned in the comments)

arguments *vars = (arguments *) (args);
std::cout << "\n" << vars->a << "\t" << vars->b << "\t" << vars->c << "\n";

Solution 4

The problem as bdonlan said is "dereferencing void* before casting".

I think this example would help:

#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;
}
Share:
51,271
Matt Munson
Author by

Matt Munson

Jack of some trades.

Updated on June 22, 2020

Comments

  • Matt Munson
    Matt Munson almost 4 years

    I have a C++ program:

    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";
        }
    };
    

    On compile it throws an error:

    error: ‘void*’ is not a pointer-to-object type
    

    Can someone explain what I am doing wrong to produce this error?

  • visual_learner
    visual_learner over 12 years
    Leaving it as a pointer is probably better, since it avoids a copy constructor. However, the OP should make the pointer (both arguments * and void *) const.
  • Billy ONeal
    Billy ONeal over 12 years
    But please use static_cast here -- you'd get a better error message that way...
  • Matt Munson
    Matt Munson over 12 years
    @Billy what does static_cast do?
  • Billy ONeal
    Billy ONeal over 12 years
    @Matt: Same thing as a C style cast, except more limited. static_cast disallows removal of const, reinterpretation of a pointer type, and a few other nasty things. Generally speaking, anything that static_casts will work across platform/architectures. See section 5.2.9 of the C++ standard for more details (assuming C++03)