0

次のコードでは、17 行目でコンパイル エラーが発生します。

#include <boost/bind.hpp>
#include <boost/function.hpp>

void func()
{}

class A{
public:

    template <typename T>
    static void foo(T const& arg){}

    template <typename T>
    void bar(T const& arg){
        boost::bind(&A::foo<T>, arg);  //OK
        boost::function<T> functor1 = boost::bind(func); //OK
        boost::function<T> functor2 = boost::bind(&A::foo<T>, arg); //ERROR, LINE 17
    }
};

int main()
{
    A obj1;
    obj1.bar(func);
}

問題は、17 行目の functor2 のプロトタイプはどうあるべきかということです。
functor2 のプロトタイプを「boost::function<void()>」にしたい場合、boost::bind がそのような型を返すようにするにはどうすればよいですか?

コンパイル エラー:usr/include/boost/bind/bind.hpp:253: error: invalid initialization of reference of type 'void (&)()' from expression of type 'void (*)()'
どういう意味ですか?

4

3 に答える 3

3

foo(T const& arg)参照引数を取ります。を介して参照引数を渡すには、boost::bindでラップする必要がありますboost::ref

boost::function<T> functor2 = boost::bind(&A::foo<T>, boost::ref(arg));
于 2012-10-01T19:09:00.243 に答える
0

boost::bind の戻り値の型は何ですか? をご覧ください

要するに、私はただ書くだけです

auto functor2 = boost::bind(&A::foo<T>, arg);

gcc 4.6+ またはオプション付きの gcc 4.4 でコンパイルし--std=gnu++0xます。

于 2012-04-11T20:05:57.727 に答える
0

私はバインドの経験がありませんが、通常、メンバー関数を呼び出しているクラスのインスタンスは必要ありませんか? バインドに含めない場合は、呼び出しサイトに含める必要があります。私の例を使用autoして(上記を読んで使用できませんが、簡潔にするために使用します)、 A::bar() メソッドを再実装します。

void bar(T const& arg){
    auto barebones = boost::bind(&A::foo<T>, arg);
    // OR
    auto barebones = boost::bind(&A::foo<T>, _1, arg);
    barebones(this); // Need an instance, or a pointer to an instance of A
    boost::function<T> functor1 = boost::bind(func); // OK because func is a bare function with no arguments
    boost::function<T> functor2 = boost::bind(&A::foo<T>, this, arg); // betting that would work
    functor2(); // with my modification, I think that'll work.
}

最初の引数がその場所を取ることを示すために _1 構文が必要な場合があります。または、それがなくても機能する場合があります。私は100%確信が持てません(コンパイルしていません)が、ブーストサイトのドキュメント(boost bind doc、boost mem_fn doc)に基づいて、これが起こっていると思います。

なぜ最初の部分がコンパイルされたのか、私にはわかりません。元の構文は問題ないと思われますが、クラス インスタンスを渡す必要があります。追加の引数を必要としない "生の" 呼び出し可能なオブジェクトを探している場合は、バインド時にインスタンス (またはインスタンスへのポインター、またはインスタンスへのスマート ポインター) を渡す必要があります。

型の推測に問題がある場合は、可能であれば BOOST_AUTO() マクロを試してください。 ドキュメント リンク

于 2012-04-11T22:12:54.107 に答える