3

私はコンテナオブジェクトを持っています:

R Container;

R は型list<T*>またはvector<T*>

次の関数を記述しようとしています。

template<typename T, typename R>
T& tContainer_t<T, R>::Find( T const item ) const
{   
typename R::const_iterator it = std::find_if(Container.begin(), Container.end(),  [item](const R&v) { return item == v; });
if (it != Container.end())
    return (**it);
else
    throw Exception("Item not found in container");
}

メソッドを試すとき(vは私のクラスのオブジェクトです)

double f = 1.1;
v.Find(f);

私は得るbinary '==' : no operator found which takes a left-hand operand of type 'const double' (or there is no acceptable conversion)

ラムダ式の構文とそこに何を書くべきかについて混乱しており、分かりやすい説明が見つかりませんでした。

なにが問題ですか ?10倍。

4

1 に答える 1

6

少し文脈が欠けていますが、私は注意します:

  • あなたは戻ってき**itたので、おそらく比較したい*v==itemt
  • ラムダconst R&vに意図したと思われる場所を通過しますconst T&v
  • const_iterator を使用しましたが、非 const 参照を返しました。ミスマッチだった
  • 効率化のためにいくつかのパラメータ const& を作成しました(およびコピー不可/移動不可のタイプをサポートするため)

欠落しているクラス参照を取り除いた作業コードを次に示します。

#include <vector>
#include <algorithm>
#include <iostream>

template<typename T, typename R=std::vector<T> >
T& Find(R& Container, T const& item ) 
{   
    typename R::iterator it = std::find_if(Container.begin(), Container.end(),  [&item](const T&v) { return item == v; });
    if (it != Container.end())
        return *it;
    else
        throw "TODO implement";
}

int main(int argc, const char *argv[])
{
    std::vector<double> v { 0, 1, 2, 3 };
    Find(v, 2.0); // not '2', but '2.0' !
    return 0;
}
于 2012-05-23T10:06:29.230 に答える