1

私は機能を持っています:

std::function<void(sp_session*)> test(void(MainWindow::*handler)())
{
    return ...;
}

ハンドラーの型を同等の std::mem_fn 型に置き換えたいと思います。

タイプは何ですか?

私はこれを試しました:

std::function<void(sp_session*)> test(std::mem_fn<void(), MainWindow>  handler)    
{
    return ...;
}

しかし、VC++ 2010 は次のエラーを吐き出します。

error C2146: syntax error : missing ')' before identifier 'handler'
error C2059: syntax error : ')'
error C2143: syntax error : missing ';' before '{'
error C2447: '{' : missing function header (old-style formal list?)

だから私は何が間違っていたのか分かりません。

4

2 に答える 2

4

関数の C++11 バインダー ファミリ ( mem_fnbind) によって返される正確な型は未指定です。つまり、これは実装の詳細であり、気にする必要はありません。

§20.8.9 [func.bind]

template<class F, class... BoundArgs>
unspecifiedbind(F&&, BoundArgs&&...);

§20.8.10 [func.memfn]

template<class R, class T>
unspecifiedmem_fn(R T::* pm);

"回避策": テンプレートを使用します。

template<class F>
std::function<void(sp_session*)> test(F handler)
{
    return ...;
}
于 2012-10-06T15:16:28.247 に答える
1

std::mem_fn探しているタイプではありません。
必要なタイプstd::functionは、インスタンスを引数としてとることです:

std::function<void(sp_session*)> test(std::function<void(MainWindow *)> handler)

メンバー関数にバインドでき、最初のパラメーターとしてインスタンスと共に使用されます。
元の関数の場合、次のようにします。

instance->*handler();

新しい関数では、次のことを行います。

handler(instance);
于 2012-10-06T16:38:16.843 に答える