web-dev-qa-db-ja.com

C ++。エラー:voidはオブジェクトへのポインター型ではありません

私は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

誰かがこのエラーを生成するために私が間違っていることを説明できますか?

19
Matt Munson

具象型にキャストする前にvoid *を逆参照しています。あなたはそれを逆に行う必要があります:

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

コンパイラが*argsに適用する方法を知らないため、この順序は重要です(void *であり、逆参照することはできません)。 (arguments *)は何をすべきかを指示しますが、逆参照が既に発生しているため、遅すぎます。

25
bdonlan

上記のエラーを再現するためのベアボーンの例:

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

上記のコードは、ボイドへのポインターを逆参照しようとしているため間違っています。それは許されない。

ここで、次のコードを実行します。次のコードが実行され、上記のコードが実行されない理由を理解すれば、内部で何が行われているのかを理解できるようになります。

#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;
}
6
Eric Leschinski

*が間違った場所にあります。したがって、void*を逆参照しようとしています。代わりにこれを試してください:

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

別の方法として、これを行うことができます:(これにより、コメントで言及されているように、copy-constructorも回避されます)

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

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;
}
1
gandalf

* argsは、「オブジェクト(値)argsが指す」を意味します。したがって、object(argument)へのポインターとしてキャストすることはできません。それがエラーを出している理由です

0
user966379

上記の問題は、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 *ポインターを遅延させることができます。

0