2012-10-27 6 views
10

から取得した次のコードをコンパイルしようとしていますが、コンパイルエラーが発生します。誰に何が間違っているかもしれない考えを持っていますか?std :: functionがVS2012でコンパイルされていません

コード

#include <iostream> 
#include <functional> 

struct Foo { 
    Foo(int num) : num_(num) {} 
    void print_add(int i) const { std::cout << num_+i << '\n'; } 
    int num_; 
}; 


int main() 
{ 
    // store a call to a member function 
    std::function<void(const Foo&, int)> f_add_display = &Foo::print_add; 
    Foo foo(314159); 
    f_add_display(foo, 1); 
} 

コンパイルエラー:

Error 1 error C2664: 'std::_Func_class<_Ret,_V0_t,_V1_t>::_Set' : 
cannot convert parameter 1 from '_Myimpl *' to 'std::_Func_base<_Rx,_V0_t,_V1_t> *' 

感謝。

+1

@jogojapan:今、次の作品のために

print_add'は、2つの引数を取り、 '、それは' _implicit_を持ってthis' 'Foo const *'型の引数も同様です。 –

+0

@ K-balloはい、申し訳ありません。 – jogojapan

+0

@ K-ballo: 'std :: function'は、最初のパラメータ型がメンバのクラス型への参照/ポインタ型である場合、自動的に' std :: mem_fn'を使います。 – Xeo

答えて

7

これはVS2012のバグのようです。私はバグレポートhereを作成しました。

編集:STDを使用するXEOの提案に基づいて編集した:: mem_fnの

#include <iostream> 
#include <functional> 

struct Foo { 
    Foo(int num) : num_(num) {} 
    void print_add(int i) const { std::cout << num_+i << '\n'; } 
    int num_; 
}; 

int main() 
{ 
    // store a call to a member function 
    std::function<void(const Foo&, int)> f_add_display = std::mem_fn(&Foo::print_add); 
    Foo foo(314159); 
    f_add_display(foo, 1); 
} 
+2

あなたのコードはちょっと変です。あなたは 'foo'をバインドして、まだ' std :: function 'を持っています。これが働く唯一の理由は、 'std :: bind'が不要な引数を取り除くからです。あなたが問題にしようとしているのと同じことは、 'std :: mem_fn(&Foo :: print_add)'を使うことです。 – Xeo

+0

@ Xeoいつstd :: bindとstd :: mem_fnのどちらを使うべきですか? std :: mem_fnはもっと簡単に見えます。 –

+0

'std :: mem_fn'は、メンバポインタの単純なラッパで、関数オブジェクトを返します。関数オブジェクトは、最初のパラメータとしてクラスへのポインタまたは参照をとり、それ以降のメンバ関数(存在する場合)からのすべてのパラメータをとります。 'std :: bind'は、引数を関数に束縛するためのものです。 – Xeo

関連する問題