2017-12-22 48 views
0
no suitable user-defined conversion from "std::_Binder<std::_Unforced, void (Test::*)(int p_test), Test *, int>" to "std::function<void (Test::*)(int)>" exists 

だから私は間違いがどこにあるのか本当にわかりません。私は昨年の夏から関数ポインタを使用していませんでしたが、この例はstd :: functionとstd :: bindを学習していた時に元に戻りました。クラスメンバーへのC++関数ポインタ

#include <iostream> 
#include <string> 
#include <functional> 

class Test 
{ 
public: 
    void display(int p_test) 
    { 
     std::cout << p_test; 
    } 
}; 

void main() 
{ 
    Test t1; 

    std::function<void(Test::*)(int)> test = std::bind(&Test::display, &t1, 1); 
} 
+1

'std :: bind()'の代わりに 'auto'とラムダ関数を使います。 – user0042

答えて

3

あなたが本当にあなたのdisplay機能(すなわち、暗黙的thisパラメータと明示intパラメータの両方)の両方のパラメータをバインドする場合は、あなたのdisplayメンバ関数を使う場合は

std::function<void()> test = std::bind(&Test::display, &t1, 1); 
test(); 

を結合した後void()関数となりますただthisパラメータをバインドする、あなたなら、それはvoid (int)機能

std::function<void (int)> test = std::bind(&Test::display, &t1, std::placeholders::_1); 
test(42); 

になるでしょうその後、あなたのdisplay機能がTest *intタイプ

ので
std::function<void (Test *, int)> test = &Test::display; 
test(&t1, 123); 

の二つのパラメータを持つ関数である、任意のパラメータをバインドしたくない、あなたが最初に決定する必要がありますが、バインドしたいどのパラメータとそれはあなたがするパラメータ縛られないでください。

-1

このようにstd :: functionを使用する必要があります。 @ user0042として

std::function<void()> 

autoがここで仕事をするだろう、提案、私はあなたがファンクタにしたいと思います。それではstd::functionが正しい方法です。 autoは、ファンクタをクラスなどに格納したい場合は役に立ちません。 std::bindは少しわかりにくいですが、これを回避するにはlambdaが必要ではないと思います。

+0

私のdownvoteではありません。しかし、OPの 'bind'呼び出しを使用した場合、' std :: function 'ではなく' std :: function 'が必要です。 OPの 'bind'は両方の*パラメータを束縛します。 – AnT

+0

あなたは正しいです。私はこれを訂正します。 – DNK

関連する問題