私は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 *)
は何をすべきかを指示しますが、逆参照が既に発生しているため、遅すぎます。
上記のエラーを再現するためのベアボーンの例:
#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;
}
*
が間違った場所にあります。したがって、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";
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;
}
* argsは、「オブジェクト(値)argsが指す」を意味します。したがって、object(argument)へのポインターとしてキャストすることはできません。それがエラーを出している理由です
上記の問題は、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 *ポインターを遅延させることができます。