0

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

      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:関数object / lambdaまたは同様のものを使用できたはずですが、boost::phoenixを試してみたかったのです。

4

2 に答える 2

2

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

の代わりにsecond、を使用できますsecond_type。これはtypedef、ペアの2番目の要素のタイプを表します。

boost::phoenix::sort ( boost::phoenix::bind( &std::pair<int, Foo>::second_type::getvalue, boost::phoenix::arg_names::arg1) (*fooVec.begin() ), std::less<int>() );
于 2011-11-08T14:53:11.893 に答える
2

コメントしたように、ベクターからフェニックスアクターを作成する方法を使用してソートできるとは思いませんが、フェニックスのアルゴリズムを使用したことがないため、よくわかりません。もちろん、sortを使用し、フェニックスを使用してファンクターを作成してソートすることもできます。
したがって、この方法でフェニックスを使用することをお勧めします。

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))
        );
于 2011-11-08T15:30:21.247 に答える