2016-06-01 14 views
1

テンプレートを使用して別のクラスメソッドにクラスメソッドを渡そうとしていますが、どのようにするかについての回答が見つかりません(C++ 11、boost ok) :私はエラーとして取得テンプレートを使用してクラスメソッドに引数として渡したクラスメソッド

class Numerical_Integrator : public Generic Integrator{ 
    template <class T> 
    void integrate(void (T::*f)()){ 
     // f(); //already without calling f() i get error 
    } 
} 

class Behavior{ 
    void toto(){}; 

    void evolution(){ 
     Numerical_Integrator my_integrator; 
     my_integrator->integrate(this->toto}; 
} 

私は、コアの問題を単純化し

error: no matching function for call to ‘Numerical_Integrator::integrate(<unresolved overloaded function type>)’this->toto); 
note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘void (Behavior::*)()’ 

ありがとうございました。

ボーナス:引数についてはどうですか?

+2

[Boost機能](http://www.boost.org/doc/libs/1_61_0/doc/html/function.html)および[Boost bind](http://www.boost.org/doc/) libs/1_61_0/libs/bind/doc/html/bind.html)?あるいは、[標準アルゴリズムライブラリ](http://en.cppreference.com/w/cpp/algorithm)を見て、それらがどのように "述語"を扱うかを見てください。 –

+0

Tは何のために必要ですか?検証? – thorsan

+0

'f(a、arg);' < - 関数に 'this'として動作するオブジェクトも必要です。 – coyotte508

答えて

6

あなたの質問は、実際にはテンプレートパラメータの一部としてクラスメソッドを渡すことではありません。

あなたの質問は、実際にはクラスメソッドを正しく呼び出すことです。

以下の非鋳型と同等のいずれか動作しません

class SomeClass { 

public: 

    void method(); 
}; 

class Numerical_Integrator : public Generic Integrator{ 
    void integrate(void (SomeClass::*f)()){ 
     f(); 
    } 
} 

クラスメソッドは、関数ではなく、それ自体によって、関数として呼び出すことができません。あなたが最初にこの問題を解決するために、あなたのテンプレートのデザインを修正する必要があり、および/またはクラス階層

class Numerical_Integrator : public Generic Integrator{ 
    void integrate(SomeClass *instance, void (SomeClass::*f)()){ 
     (instance->*f)(); 
    } 
} 

:クラスメソッドは、呼び出されるの線に沿って何かをクラスのインスタンスが必要です。クラスメソッドの呼び出しを正しく実装したら、テンプレートを実装することは問題ではありません。

+0

あなたの答えをありがとう。しかし、void integrate(SomeClass * instance、void(SomeClass :: * f)())を使用すると、同じエラーが返されます: '<未解決オーバーロードされた関数型>'から 'void(Behavior :: * () ' – Napseis

+1

メソッドへのポインタを取得する正しい構文は '&Class :: method'です。 –

+0

fantastic、それは今コンパイルされます。これについての説明はどこにありますか?ありがとう – Napseis

関連する問題