2011-10-17 16 views
5

私は作業中の課題でこの問題に対して頭を悩ましていましたが、まったく動作しないようです。私は何をしようとしているのかを実証するための小さなテストクラスを書いてくれました。機能テンプレートクラスのメンバ関数へのポインタ? (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; 
} 

- そして、ここでは、メインです:

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

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

    cin.get(); 
    return 0; 
} 

-and最後に、私のコンパイルエラー(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>   ] 

がうまくいけば、テスタークラスの私のコメントは、私は「何を教えてくれます私はやっています。これを見ていただきありがとうございます!

+0

がすることを確認してくださいも参照宿題タグが適切であれば追加してください。また、 'boost :: bind'、特に' boost :: mem_fn'を見てください。 –

答えて

10

メンバー関数ポインタをcorrently呼び出すことはありません。 pointer-to-member operatorという特別な演算子を使用する必要があります。

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

ほぼ正確ですが、ブラケットのペアがありません。 – UncleBens

+0

オイ、確かに。ありがとうございました! –

+0

ありがとう! – TNTisCOOL

1

へのポインタメンバ関数プラスインスタンスポインタを経由してメンバ関数を呼び出すには、演算子の優先順位を気に、->*構文が必要になります。

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

それは動作します!どうもありがとうございます。そのすべてを理解しようとすると、醜い構文でいっぱいの悪夢でした。 – TNTisCOOL

1

あなたが明示的にオブジェクトにあなたを追加する必要がありますメッセージ:

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

C++ FAQ

+0

それは動作します!ありがとうございました! – TNTisCOOL

関連する問題