2012-03-14 3 views
0

を呼び出し、これは動作しません: http://ideone.com/mGfUjバインドと周りのテンプレート関数を渡すが

どちらか動作しません:私はそれがその型を控除して少しは助け考え出し http://ideone.com/mUL5Y

を!なぜ私は理解していない。

どうすればよいですか?

part2(std::bind(&Quux::part3<Callable>, this, 3, c)) 

それはないです。

+0

コードをポストにコピーできませんでしたか?私たちは、24行のコードのオフサイトのソースを見ていますか? –

+0

@NicolBolasはい。あなたはエラーを受け取り、それをクローンすることができます。それを使って周りのプレイヤーは... irc://chat.freenode.net/##c++で適切なネチケットと見なされ、ここでも便利でした。 – Nick

答えて

1

問題はstd::bindが内部Callableのは、あなたがここに二度目のためにそれを渡すときにオブジェクトc(それが実際にstd::bind<>タイプです)に評価結果を渡していることのようですあなたが仮定しているように、std::bindオブジェクトの評価されていないバージョンを渡します。あなたのf関数がvoid型を返すので、

したがって、c式の結果は内部voidタイプではなく、未評価した呼び出し可能な関数オブジェクトとして渡されます。したがって、あなたはそれを渡しているタイプは、実際にvoidタイプであるためにターンQuux::part3でコールcを評価しようとしている、それは、Quux::part3に2番目の引数として呼び出し可能なオブジェクトを渡すことはできません、Quux::part2Callableオブジェクトcを呼び出そうとするとき、呼び出し可能な型ではありません。さらに参考のために

、こちらを参照してください。特にそのhttp://en.cppreference.com/w/cpp/utility/functional/bind

注:

std::is_bind_expression<T>::value==true場合(つまり、別のstd::bind()部分式がbindへの最初の呼び出しの引数として使用された)、そのバインドを-subexpressionがすぐに呼び出され、の結果が関数に渡されます。

あなたはあなたがそれをしたい時に起こる、とあなたはstd::bindサブ式を渡したときに、あなたがそのようなラムダ、またはstd::function<>として、別の方法を探す必要がありますないような評価を遅らせたい場合オブジェクト、ファンクタ、または呼び出し可能であり、後で評価できる状態を格納することができる他のクラスオブジェクト型である。

+0

どのように評価することができますか? cはどこにも呼び出されません...なぜそれはvoid()からvoidに変わりますか? – Nick

+1

'std :: bind'を別の' std :: bind'に渡すと、最初の部分式が評価され、* results *が2番目の 'std :: bind'に渡されます。 'void(*)(int)'を評価すると、呼び出し可能な 'void(*)(int) 'ではなく' void'型になります。あなたは明示的に 'c'を呼び出すわけではありませんが、呼び出し可能なオブジェクト自体ではなく、呼び出しが渡された結果、ネストされた' std :: bind'式のために実際に裏で呼び出されています。 – Jason

+0

ところで、クラスメソッドではなく通常の自立型関数を使用すると、この変換がどこでどのように行われるかをよりよく理解できます。[関連するエラーメッセージの例があります](http://ideone.com/CCQot) – Jason

関連する問題