0

Étant donné le code suivant que je ne peux pas compiler.Appel d'une fonction membre à partir d'un argument basé sur un modèle de fonction membre

template < typename OT, typename KT, KT (OT::* KM)() const > 
    class X 
    { 
    public: 
     KT mfn(const OT & obj) 
     { 
      return obj.*(KM)(); // Error here. 
     } 
    }; 

    class O 
    { 
    public: 
     int func() const 
     { 
      return 3; 
     } 
    }; 

    int main(int c, char *v[]) 
    { 
     int a = 100; 

     X< O, int, &O::func > x; 

     O o; 

     std::cout << x.mfn(o) << std::endl; 
} 

Je reçois le message d'erreur folling

error: must use '.*' or '->*' to call pointer-to-member function in '&O::func (...)' 

Je pensais que j'utilisais. * Mais j'ai évidemment eu quelque chose de mal.

Comment appeler la fonction membre?

J'ai essayé

return obj.*(template KM)(); 
return obj.*template (KM)(); 
return obj.template *(KM)(); 

Aucun qui a travaillé.

+1

pointeur à la fonction sont bêtes vraiment effrayant :( –

+0

Notez que 'template' est nécessaire uniquement pour les modèles dépendants et' O :: func' n'est pas une fonction de modèle. –

Répondre

5

La syntaxe correcte est

return (obj.*KM)(); 
+0

Merci Gareth .. Je suis officiellement un muppet :) C'était à peu près le seul que je n'ai pas essayé. – ScaryAardvark

+0

Pour rappel, pensez que le pointeur de la fonction n'est pas complet sans l'objet sur lequel il va agir ('ceci 'est nécessaire après tout). Si vous prenez un point de vue des foncteurs, cela a plus de sens, du moins c'est comme ça que j'essaie de me souvenir de la syntaxe ... et quand je ne peux pas, je viens de google 'C++ pointer to function' et voici le lien qui vient toujours : http://www.newty.de/fpt/fpt.html :) –