2016-10-31 2 views
0

Disons que j'ai les définitions suivantes:pointeur C de la fonction de membre non un pointeur de fonction

class ScriptInterpreter { 
public: 
class cell; 
typedef ScriptInterpreter::cell (ScriptInterpreter::*proc_t) (const std::vector<cell> &); 

class cell { 
public: 
    proc_t proc; 
}; 

ScriptInterpreter::cell proc_add(const std::vector<cell> & c); 
}; 

et le code suivant passe:

ScriptInterpreter::eval(ScriptInterpreter::cell cell, environment * env) 
{ 
// ... 

ScriptInterpreter::cell c; 
c.proc = &ScriptInterpreter::proc_add; 

return (c.*proc_)(exps); 
} 

Sur la ligne où je tente d'appeler la pointeur de fonction je reçois l'erreur

error: called object type 'proc_t' (aka 'ScriptInterpreter::cell (ScriptInterpreter::*)(const std::vector<cell> &)') is not 
    a function or function pointer 

Quand j'ajoute le * devant la fonc sorte que la ligne ressemble à ceci:

ScriptInterpreter::cell c = (proc_cell.*proc_)(exps); 

il produit ceci:

error: use of undeclared identifier 'proc_' 

Je l'ai déjà regardé Callback functions in c++ et d'autres problèmes de ce genre, mais rien ne m'a vraiment donné un soupçon qui ne va pas ou fourni des informations au sujet de mon erreur. Je n'ai définitivement aucun nom deux fois ou quelque chose de ce genre. Aussi après avoir lu what is an undeclared identifier error and how do i fix it je suis sûr que j'ai tout bien.

Alors qu'est-ce que je fais mal?

Edit: mis à jour le code avec le code réel au lieu du code de l'espace réservé

+1

Tout d'abord, il n'y a pas de 'B' dans votre code. Seulement 'A :: B'. Il est préférable de poster du vrai code pour votre 'main', afin que les gens comprennent de quoi vous parlez. – AnT

+0

Vous avez besoin d'un objet de 'A' (pas' B') pour l'appeler, puisqu'il s'agit d'un pointeur vers la fonction membre de 'A'. – songyuanyao

+0

B n'appartient pas à A – Raindrop7

Répondre

0

Pour appeler une fonction membre par un pointeur de type pointeur à membre, vous devez utiliser l'opérateur .* ou opérateur ->*. Et sur le côté gauche, vous devez spécifier l'objet pour lequel vous voulez appeler cette fonction membre.

Dans votre cas, une tentative de faire qui pourrait se présenter comme suit

A::B b_object; 
b_object.func = &A::func_to_call; 

A a_object; 
A::B other_b_object = (a_object.*b_object.func)(); 

Notez que depuis le pointeur est déclarée comme désignant un membre de A, l'opérateur .* ont besoin d'un objet de type A à gauche -côté.

Cependant, dans votre cas spécifique, ceci est mal formé car b_object.func est privé et n'est pas accessible depuis main.

P.S. int main, et non void main.