2012-02-07 12 views
1

C++ STLでmen_funとbind1st上の古い問題:このコードのために、今すぐいくつかの簡単なコードは、問題を説明します

class Foo {}; 
struct Bar { 
    bool foo(const Foo &f) const { return false; } 
}; 

int main() { 
    Bar bar; 

    vector<Foo> v; 

    std::find_if(v.begin(), v.end(), std::bind1st(
     std::mem_fun_ref(&Bar::foo), bar)); 

    return 0; 
} 

は、VS2010のC++コンパイラが文句を言うだろう: エラーC2535を:BOOLのstd :: binder1st < _Fn2> ::演算子()(のconst Fooの&)constは:すでに以前のバージョンのVisual Studioで宣言

で定義された メンバ関数、問題を参照するために参照するために関連している2つの以上のコンパイルエラーが存在することになります。これらの問題はVS2010で発生しましたが、C2535は残っています。

この質問はthis oneに似ています。その投稿が示唆しているように、私はstd :: bindやboostライブラリを代わりに使うことができます。彼らはうまく動作しますが、今のところ、私はこの場合に古いbind1stスタイルを使用することが可能かどうか、あるいはSTLの機能フレームワークに固有のこの問題が多いことを知りたいのですか? ありがとう!

答えて

3

これはVSまたは任意のコンパイラの問題ではありません。 mem_fun_refによって返される型は、単項関数を継承するmem_fun_ref_tです。このファンクタは、メンバ関数が属するクラス型でなければならない1つの引数をとります。 mem_fun_refは引数を取るメンバ関数では機能しません。

バインダーは理由で廃止されました:彼らは吸う。

+0

これは当てはまりません。 'mem_fun_ref'は1つの引数を取るメンバ関数のオーバーロードを持っています。戻り値の型は 'const_mem_fun1_ref_t <_Result、_Ty、_Arg>'です。これはbinary_functionのサブタイプです。 VS2010では、ヘッダファイルに定義されています weidi

+0

@weidi '[deprecated.member.pointer.adaptors]'のD8.2.2で 'const_mem_fun_ref_t'の定義を見つけることができます。おそらく、MSVCの拡張機能があります。私はMSDN上でそれについてのドキュメントを見つけることができませんでした。 – pmr

+0

[this](http://msdn.microsoft.com/en-us/library/etctxx69(v = vs.100).aspx)はMSDNのドキュメントですか?私はそれを誤解している場合はごめんなさい。私は実際に様々なC++ドキュメントについて多くのことを知らないし、D8.2.2が何を指しているのか分からない。アダプターの廃止予定が記載されているリンクを共有できますか? – weidi

0

Using bind1st for a method that takes argument by referenceをご覧ください。 あなたの場合に似ているようです。

+0

いいえ、そうではありません。それでも動作しません。私の答えを読んでください。ありがとう。 – pmr

+0

ありがとう。その投稿は、C++ 11やboostへの転換以外の解決策を提供していません。bind1stの設計に本質的に何か問題があるかもしれないという私の意見を支持しているようです。 – weidi

関連する問題