2011-02-03 6 views
0

find_if私は次のエラーを取得する:: find_if機能:このSTDと何が間違っている:: STDをコンパイルするとき

error C2451: conditional expression of type 'overloaded-function' is illegal 

コードは次のようになります。

typedef std::vector<boost::shared_ptr<node> >::iterator nodes_iterator; 

nodes_iterator node_iter = std::find_if(_request->begin(), _request->end(), boost::bind(&RequestValues::is_parameter, this)); 

bool RequestValues::is_parameter(nodes_iterator iter) 
{ 
    return ((*iter)->name.compare("parameter") == 0); 
} 

持っているようですstd::find_ifに渡された述語関数と関係するものですが、何が間違っているのか分かりませんが、誰でも助けてくれますか?

nodeは、いくつかの値を含むstructです。

答えて

3

バインディング時には_1でなく、thisを使用し、value_typeを関数の引数として使用してください。

これがクラスまたは構造体メンバ関数の場合、bind(func, this, _1)は多分?しかし、クラスメンバ関数の場合は、状態を記述する必要がないため、おそらく静的でなければなりません。

1

find_ifに提供する比較関数は、イテレータを取り込むのではなく、イテレータが指している値(またはそれよりも優れている場合はconst参照)を取り込むべきです。たとえば、find_ifの述部をintの範囲で記述する場合、比較はvector<int>::iteratorではなく、intになります。 shared_ptr<node>で動作するように比較関数を変更すると、すべてのエラーは修正されないかもしれませんが、少なくともそれらのエラーの一部を考慮する必要があります。

1

その関数のシグネチャは、すなわち、それはイテレータを取ることはありませんが、イテレータのvalue_type

bool RequestValues::is_parameter(boost::shared_ptr<node>); 

でなければなりません。

+0

私はまだこの関数のシグネチャで同じエラーが発生します.... :( –

+0

@トニー:申し訳ありませんが、私はそのショットでターゲットを逃しました。 – sbi

関連する問題