Je reçois une erreur de compilation (MS VS 2008) que je ne comprends tout simplement pas. Après avoir joué avec elle pendant de nombreuses heures, tout est floue et je me sens comme il y a quelque chose de très évident (et très stupide) qui me manque. Voici le code essentiel:
typedef int (C::*PFN)(int);
struct MAP_ENTRY
{
int id;
PFN pfn;
};
class C
{
...
int Dispatch(int, int);
MAP_ENTRY *pMap;
...
};
int C::Dispatch(int id, int val)
{
for (MAP_ENTRY *p = pMap; p->id != 0; ++p)
{
if (p->id == id)
return p->pfn(val); // <--- error here
}
return 0;
}
4 Réponses :
Essayez
OUI!! C'est ça. Merci beaucoup. Vous êtes incroyable. J'ai vissé avec ceci pendant des heures et j'ai reçu la réponse en moins de 10 minutes.
p-> PFN est un pointeur de fonction. Vous devez utiliser * pour le faire fonctionner. Changer de
(*(p->pfn))(val)
Je ne sais pas quel objet de type p-> pfn code> est un pointeur de type pointeur à membre. Afin d'appeler une fonction via un tel pointeur, vous devez utiliser l'un ou l'autre opérateur -> * code> ou l'opérateur . * Code> et fournir un objet de type C code > comme l'opérande gauche. Vous n'avez pas fait. C code> est censé être utilisé ici - vous seul savez que - mais dans votre exemple, il est pourrait être em> > * Ceci code>. Dans ce cas, l'appel peut sembler comme suit P> PFN pfn = p->pfn;
(this->*pfn)(val);
Juste pour sonner avec ma propre expérience, j'ai rencontré une erreur dans g ++ causée par cette affirmation: où StateHandler est un pointeur à une fonction de membre vide de la classe. référencé par * ceci. Le problème a été causé par les espaces entre l'opérateur de flèche. L'extrait suivant compile bien: p> J'utilise g ++ (GCC) 4.4.2 20090825 (PRERRELASe). FWIW. P> P>
C Syntaxe est rouillée, donc ne pas ajouter comme réponse, ne devrait-il pas être "retour (* (p-> pfn)) (Val);"? -
Nope, qui donne l'erreur "* Illégale sur les opérandes de type C :: Pfn".
Dupliqué possible de appelant des méthodes de classe C ++ via un pointeur de fonction