Функция Указатель на функцию-член шаблона класса? (C ++) - PullRequest
5 голосов
/ 18 октября 2011

Я бился головой об этой проблеме в задании, над которым я работал, и никак не могу заставить его работать.Я написал небольшой тестовый класс, чтобы продемонстрировать, что я пытаюсь сделать, и, надеюсь, кто-то может объяснить, что мне нужно сделать.

//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;
}

- и вот главное:

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

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

    cin.get();
    return 0;
}

и, наконец, ошибки моего компилятора (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>          ]

Надеюсь, мои комментарии в классе Tester скажут вам, что я пытаюсь сделать.Спасибо, что нашли время взглянуть на это!

Ответы [ 3 ]

10 голосов
/ 18 октября 2011

Вы не вызываете указатель на функцию-член случайно;для этого необходимо использовать специальный оператор, называемый оператор указателя на член .

template <typename T>
inline void Tester<T>::doFcn( FcnPtr fcn )
{
    (this->*fcn)( this->data );
    //   ^^^
}
2 голосов
/ 18 октября 2011

Чтобы вызвать функцию-член через указатель на функцию-член плюс указатель экземпляра, вам нужен синтаксис ->*, с учетом приоритета оператора:

(this->*fcn)(data);
1 голос
/ 18 октября 2011

Вам необходимо явно добавить объект, к которому вы пришли сообщение:

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

см. Также C ++ FAQ

...