2012-04-11 16 views
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のprotoypeがどうあるべきか、ですか?
私は本当に後押し::機能<のボイド()>を、ブーストを作る方法」であることをfunctor2のプロトタイプを維持したい場合は::バインドは、このような型を返す

コンパイルエラーは次のとおりです。?usr/include/boost/bind/bind.hpp:253: error: invalid initialization of reference of type 'void (&)()' from expression of type 'void (*)()'
何それが意味するのでしょうか?

+0

試行ブースト::関数<空隙(TのCONST&)> functor2 =ブースト::バインド(&A :: FOO 、引数)。 – Lou

+0

それは動作しません。 Tはすでに "void(*)()"であるからです。 –

答えて

3

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

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

は要するにWhat is the return type of boost::bind?

を見てください、私はちょうど

auto functor2 = boost::bind(&A::foo<T>, arg); 
を記述します10

をコンパイルし、gcc 4.6+でコンパイルするか、gcc 4.4で--std=gnu++0xオプションを指定してコンパイルします。

+0

残念ながら、私はcpp0xオプションをオンにできません。上記のサンプルコードは、実際のプロジェクトコードから単純化され、最小化されています。ビルドハーネスは固定されており、新しい標準を使用することはできません。 –

0

私はバインドに慣れていませんが、通常、メンバー関数を呼び出すクラスのインスタンスは必要ありませんか?バインドに含めない場合は、呼び出しサイトにインクルードする必要があります。

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が必要な場合があります:私の例えばautoを使用して、私は::バー()メソッドをあなたのAを再実装します(私はあなたがそれを使用することはできませんが、私は簡潔さのために意志の上に読んで)最初の引数がその場所を取ると言う構文、またはそれがなければ動作するかもしれません。私は100%確信していません(それをコンパイルしていません)が、ブーストサイト(ブーストbind doc、ブーストmem_fn doc)のドキュメントに基づいて、これは私が起こっていると思います。

なぜ最初の部分がコンパイルされたのですか?元の構文はOKだと思うが、クラスインスタンスを渡す必要がある。追加の引数を必要としない "裸の"呼び出し可能オブジェクトを探している場合は、バインディング時にインスタンス(または1つのポインタ、またはスマートポインタ)に渡す必要があります。

型の推定に問題がある場合は、可能であればBOOST_AUTO()マクロを試してください。 Doc link

関連する問題