2011-11-08 15 views
0

boost :: phoenixライブラリを使用して、以下のベクトルをソートしようとしています。クラスFooにはメンバ関数 'int getvalue()'があります。目的は 'getvalue()'によって返された値を使ってベクトルをソートすることです。しかし何かが欠けている。 ':: secondはクラスまたは名前空間ではないため、コンパイラエラーが発生します'boost :: phoenix :: sort error

 std::vector<std::pair<int, Foo> > fooVec; 

     boost::phoenix::sort (boost::phoenix::bind(&std::pair<int, Foo>::second::getvalue(), boost::phoenix::arg_names::arg1) (*fooVec.begin()), std::less<int>()); 

誰でもこの説明をしてください。この仕事をするために私は何が必要ですか?

ありがとうございました。

PS:私は関数オブジェクト/ラムダまたは類似のものを使用することができましたが、boost :: phoenixを試してみたかったのです。

+0

私はあなたのベクトルを並べ替えるとは思わない。最初のパラメータはソートされる範囲でなければなりません。あなたがphoenix表現をそれから作り出すので、あなたのベクトルは変更されません。 – mkaes

+0

あなたは私にそれを行う正しい方法を教えるのがとても親切でしょうか?ありがとう... – polapts

+0

私はこの例ではどのように私がフェニックスを使用するかの例と答えを追加しました。しかし、私はstd :: lessをもう使用できないので、あなたのアプローチとは異なります。しかし、おそらくそれは役に立ちます。 – mkaes

答えて

2

コメントし、私はフェニックスを作成することがあなたの方法とは思わないとあなたのベクトルのアクタを使ってそれをソートすることはできますが、私は決してphoenixのアルゴリズムを使用していません。 もちろん、並べ替えを使用して、phoenixで関数子を作成して並べ替えることができます。
私はこの方法でphoenixを使うことを提案します。

boost::phoenix::sort(boost::phoenix::placeholders::arg1, boost::phoenix::placeholders::arg2)(fooVec, 
     boost::phoenix::bind(&Foo::getvalue, boost::phoenix::bind(&std::pair<int, Foo>::second, boost::phoenix::placeholders::arg1)) < boost::phoenix::bind(&Foo::getvalue, boost::phoenix::bind(&std::pair<int, Foo>::second, boost::phoenix::placeholders::arg2)) 
     ); 
+0

boost :: phoenix :: sortを使用しています。 boost :: phoenix :: arg_names :: arg1を使用しています。 int配列[] = {3,1,2}; std :: list test_list(配列、配列+ 3); boost :: phoenix :: sort(arg1、std :: greater ())(test_list);これは、boost :: phoenixライブラリのリファレンスとして提供される例です。私はそれに従っていた。あなたの答えをありがとう。 – polapts

+0

oops ..私はそれを正しくフォーマットする方法がわかりません。 – polapts

+0

@Pavan:これはまさに私が何を意味しているのですか?それらは最初の引数としてコンテナを渡します。最初のパラメータとしてphoenix式を渡します。それはあなたのコンテナをソートしません。 – mkaes

2

これは、エラーメッセージに表示される内容です。 std::pair<int, Foo>::secondはデータメンバーであり、クラスまたは名前空間ではないため、演算子::を使用することはできません。

代わりのsecond、あなたはペアの2番目の要素のタイプのtypedefである、second_typeを使用することができます。

boost::phoenix::sort (boost::phoenix::bind(&std::pair<int, Foo>::second_type::getvalue, boost::phoenix::arg_names::arg1) (*fooVec.begin()), std::less<int>()); 
+0

どうすれば正常に動作させることができますか? – polapts

+0

答えを表示して更新します。 – Gorpik

+0

答えをありがとうが、残念ながらそれは動作しません。私は同じエラーが発生します。エラー: 'getvalue'は 'std :: pairのメンバーではありません :: second_type' – polapts