2

この bind の呼び出しが機能しない理由が少しわかりません。私は問題をバインドの新しい呼び出しでバインド オブジェクトをネストしようとすることに絞り込みました。

#include <iostream>
#include <algorithm>
#include <tr1/functional>
using namespace std;
using tr1::bind;
using namespace std::tr1::placeholders;

double times_2(double a) { 
    return 2*a;
}
void print_num(double a) {
    cout << a << endl;
}

template <typename Oper>
void oper_on_list(Oper op) {

    int list[] = {0,1,2,3,4};

    for_each(list, list+5, bind(print_num, bind(op, _1)));      // This works!
    for_each(list, list+5, bind(print_num, bind(op, bind(op, _1)))); // This doesn't!
}

int main() {
    oper_on_list(bind(times_2, _1));
    return 0;
}

ここでno matching function for call to 'bind'、コンパイラからメッセージを受け取ります。(G++ 4.2.1 または Apple LLVM 3.0)。

(実際にはno matching function for call to object of type 'std::tr1::_Bind<double (*(std::tr1::_Placeholder<1>))(double)>')

ここでの目標は、別のバインドでバインド オブジェクトを再利用することでした。要約すると、問題は、2 番目のバインド呼び出しの結果を、既に作成されたバインド呼び出しの引数として使用することです。これを回避する方法はありますか?

これも状況を少し明らかにするのに役立つと思いますか?:

template <typename T>
void print(T t) {
    cout << t << endl;
}

template <typename Oper>
void oper_on_list(Oper op) {

    int list[] = {0,1,2,3,4};

    for_each(list, list+5, bind(print, bind(op, _1)));        // This doesn't work
    for_each(list, list+5, bind(print<double>, bind(op, _1))); // This does
    for_each(list, list+5, bind<void(*)(double)>(print, bind(op, _1))); // So does this!
}

ここでの問題は、 に基づいて印刷用のテンプレート仕様を推測するのに問題があることだと思いますbind(op, _1)。なぜできないのかはわかりませんが..

しかし、どちらにしても、それを指定することで問題が解決するようです。残念ながら、元の例でテンプレートを指定する方法がわかりませんOper

どんな助けでも大歓迎です!:Dありがとう!

============================

アップデート!これは C++11 で正しくコンパイルされることがわかりました。問題は、これが C++11 なしでコンパイルされないのはなぜですか? 私の知る限り、C++11 固有の機能はありません。C++11 なしでこれと同じタスクを達成する方法はありますか? おそらく、コードを設定する別の方法ですか?

============================

アップデート2!まあ、これはboost::bindで動作するので、単にtr1::bindの問題だと思います..

4

1 に答える 1

0

とにかく、これはboost::bindで動作します。

したがって、どうやらそれは tr1::bind pre-C++11.. の単なるバグです。

于 2013-02-10T06:48:32.453 に答える