2017-05-25 7 views
0

は、私は次のエラーを受け付けておりますVS 2017で次のコードのstd ::関数はstd ::ラムダ過負荷曖昧でバインド

class my_class { 
public: 
struct my_struct { 
    int i; 
}; 
std::function<void(my_struct&)> func; 
my_class() { 
    func = std::bind([this](my_struct& s) { s.i = 5; }); 
} 
}; 

を考えてみましょう'std :: _ Binder>' to 'std :: function' 注:コンストラクタがソースタイプを取ることができないか、コンストラクタのオーバーロードの解像度があいまいです

あいまいさを解決するために私が紛失していることについて、

答えて

3

これはこれまでにない最も有用なコンパイラエラーです。問題は、「私にg(/* anything */)f()なるようなgを与える意味。

あなたは引数を通過したい場合は、プレースホルダを使用する必要があるあなたが

func = std::bind([this](my_struct& s) { s.i = 5; }, std::placeholders::_1); 
//             ^^^^^^^^^^^^^^^^^^^^^ 

std::bind(f)をしたいということである。

(私は仮定しますあなたの実際のコードは、これよりも複雑です。bindは必要ありません。または、あなたが示したコードにthisを取り込むことができます。

+0

ありがとうございました! – schuess

2

std::bindは、C++で多かれ少なかれ廃止されました。代わりにラムダを使用してください。

class my_class 
{ 
public: 
    struct my_struct { 
    int i; 
    }; 
    my_class() 
    : func ([](my_struct& s) { s.i = 5; }) {} 
private: 
    std::function<void(my_struct&)> func; 
}; 
+0

Y平均C++ 14。コピーするのではなく、C++ 11のラムダのコンテキストに移動するものをサポートするために 'std :: bind'が必要です。 – StoryTeller

+0

@StoryTeller C++ 11では*ほとんど*廃止されました(多かれ少なかれ*)。 C++ 14では、それはさらに(完全に)時代遅れです。 – Walter

+0

実際にそれが必要なユースケースがあれば、それは時代遅れだとは言えません。しかし、おそらく私はちょうど髪を分割しています。 C++での使用はほとんどありません。 – StoryTeller