C ++. Erreur: void n'est pas un type pointeur-à-objet
J'ai un programme 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";
}
};
Sur le compiler renvoie une erreur:
error: ‘void*’ is not a pointer-to-object type
Quelqu'un peut m'expliquer ce que je fais de mal pour produire cette erreur?
source d'informationauteur Matt Munson
Vous devez vous connecter pour publier un commentaire.
Vous êtes un déréférencement de la
void *
avant la conversion vers un type de béton. Vous devez le faire dans l'autre sens:Cet ordre est important, car le compilateur ne sait pas comment les appliquer
*
àargs
(qui est unvoid *
et ne peut pas être déréférencés). Votre(arguments *)
raconte ce qu'il a à faire, mais il est trop tard, parce que le déréférencement a déjà eu lieu.Bare bones exemple à reproduire l'erreur ci-dessus:
Le code ci-dessus est faux, car il est tentant de déréférencer un pointeur sur void. Ce n'est pas permis.
Maintenant, exécutez le code suivant ci-dessous, Si vous comprenez pourquoi le code suivant s'exécute et le code ci-dessus ne fonctionne pas, vous serez mieux outillés pour comprendre ce qui se passe sous le capot.
Vous avez le
*
dans le mauvais endroit. Si vous essayez de déréférencement de lavoid*
.Essayez plutôt ceci:
Sinon, vous pouvez faire ceci: (ce qui évite aussi le constructeur par copie - comme mentionné dans les commentaires)
*args signifie "l'objet(valeur) args points". Par conséquent, il ne peut pas être utilisé comme pointeur vers l'objet(argument). C'est pourquoi il est donné d'erreur
Le problème que bdonlan dit est "déréférencement
void*
avant de casting".Je pense que cet exemple: