2011-10-17 4 views
5

J'ai commencé à m'attaquer à ce problème dans une mission sur laquelle je travaillais, et je n'arrive pas à le faire marcher du tout. J'ai écrit un petit cours d'essai pour montrer ce que j'essaie de faire, et j'espère que quelqu'un pourra expliquer ce que je dois faire.Fonction Pointeur vers la fonction membre de la classe de modèle? (C++)

//Tester class 
#include <iostream> 
using namespace std; 

template <typename T> 
class Tester 
{ 
    typedef void (Tester<T>::*FcnPtr)(T); 

private: 
    T data; 
    void displayThrice(T); 
    void doFcn(FcnPtr fcn); 

public: 
    Tester(T item = 3); 
    void function(); 
}; 

template <typename T> 
inline Tester<T>::Tester(T item) 
    : data(item) 
{} 

template <typename T> 
inline void Tester<T>::doFcn(FcnPtr fcn) 
{ 
    //fcn should be a pointer to displayThrice, which is then called with the class data 
    fcn(this->data); 
} 

template <typename T> 
inline void Tester<T>::function() 
{ 
    //call doFcn with a function pointer to displayThrice() 
    this->doFcn(&Tester<T>::displayThrice); 
} 

template <typename T> 
inline void Tester<T>::displayThrice(T item) 
{ 
    cout << item << endl; 
    cout << item << endl; 
    cout << item << endl; 
} 

-et voici principale: dans la classe de testeur

#include <iostream> 
#include "Tester.h" 
using namespace std; 

int main() 
{ 
    Tester<int> test; 
    test.function(); 

    cin.get(); 
    return 0; 
} 

-et enfin, mes erreurs du compilateur (VS2010)

c:\users\name\documents\visual studio 2010\projects\example\example\tester.h(28): error C2064: term does not evaluate to a function taking 1 arguments 
1>   c:\users\name\documents\visual studio 2010\projects\example\example\tester.h(26) : while compiling class template member function 'void Tester<T>::doFcn(void (__thiscall Tester<T>::*)(T))' 
1>   with 
1>   [ 
1>    T=int 
1>   ] 
1>   c:\users\name\documents\visual studio 2010\projects\example\example\tester.h(21) : while compiling class template member function 'Tester<T>::Tester(T)' 
1>   with 
1>   [ 
1>    T=int 
1>   ] 
1>   c:\users\name\documents\visual studio 2010\projects\example\example\example.cpp(7) : see reference to class template instantiation 'Tester<T>' being compiled 
1>   with 
1>   [ 
1>    T=int 
1>   ] 

Il faut espérer que mes commentaires vous diront ce que je J'essaie de faire. Merci d'avoir pris le temps de regarder ça!

+0

Assurez-vous de ajoutez l'étiquette de devoir si c'est approprié. Jetez aussi un oeil à 'boost :: bind', plus précisément' boost :: mem_fn'. –

Répondre

10

Vous n'appelez pas le pointeur de fonction membre de manière corrective; il nécessite l'utilisation d'un opérateur spécial appelé pointer-to-member operator.

template <typename T> 
inline void Tester<T>::doFcn(FcnPtr fcn) 
{ 
    (this->*fcn)(this->data); 
    // ^^^ 
} 
+0

Presque correct, mais manquant une paire de crochets. – UncleBens

+0

Oy, en effet. Je vous remercie! –

+0

Merci beaucoup! – TNTisCOOL

1

Pour appeler une fonction membre via une fonction pointeur-à-membre-plus par exemple pointeur, vous avez besoin de la syntaxe ->*, garde la priorité des opérateurs:

(this->*fcn)(data); 
+0

Ça marche! Merci beaucoup. Essayer de comprendre tout cela était un cauchemar rempli de syntaxe laide. – TNTisCOOL

1

Vous devez ajouter explicitement l'objet message:

(*this.*fcn)(this->data); // << '*this' in this case 

pouvez aussi consulter les C++ FAQ

+0

Ça marche! Je vous remercie! – TNTisCOOL

Questions connexes