IDE VS2015 でこれを使用してテストを行っていて、コンパイラ エラーを読んでいると、Ami Tavory が私を打ち負かして質問に答えていることに気付きました。したがって、これにより、何が起こっているかについての洞察や明確さが得られる可能性があります。
それを使用した最初の検索lower_bound()
では、Amiが述べたようにコンパイルされ、コンテナへのイテレータが検索から返されます。
それを使用した2回目の検索binary_search()
ではコンパイルされず、Amiが述べたように、見つかったかどうかのようにboolのみを返します。ここでコンパイルしないのは、Visual Studio 2015 CE からのコンパイラ エラーです。
1>------ Build started: Project: LambdaTemplates, Configuration: Debug Win32 ------
1> LambdaTemplates.cpp
1>c:\program files (x86)\microsoft visual studio 14.0\vc\include\algorithm(2709): error C2664: 'bool main::<lambda_79759dd0460f5d162e02d2bb1cee5db7>::operator ()(vector_test *,std::string) const': cannot convert argument 1 from 'const std::string' to 'vector_test *'
1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\algorithm(2709): note: No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1> c:\users\skilz80\documents\visual studio 2015\projects\stackoverflowsolutions\lambdatemplates\lambdatemplates.cpp(46): note: see reference to function template instantiation 'bool std::binary_search<std::_Vector_iterator<std::_Vector_val<std::_Simple_types<vector_test *>>>,std::string,main::<lambda_79759dd0460f5d162e02d2bb1cee5db7>>(_FwdIt,_FwdIt,const _Ty &,_Pr)' being compiled
1> with
1> [
1> _FwdIt=std::_Vector_iterator<std::_Vector_val<std::_Simple_types<vector_test *>>>,
1> _Ty=std::string,
1> _Pr=main::<lambda_79759dd0460f5d162e02d2bb1cee5db7>
1> ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
const std::string
パラメータ1をからに変換できないと言っていますvector_test*
では、ここで何が起こっているのでしょうか? ちょっと抽象化して、ラムダを検索関数呼び出しの述語パラメーター リストの外に一時的に書きましょう。したがって、コードのこのセクションは次のようになります。
auto myLambda = []( vector_test* ptr, std::string name ) {
return name < ptr->get_name();
};
auto it = std::binary_search( test.begin(), test.end(), name, myLambda );
if (it)
std::cout << "It is here\n";
else
std::cout << "It is NOT here\n";
次に、コンパイラ エラーを確認します。
1>------ Build started: Project: LambdaTemplates, Configuration: Debug Win32 ------
1> stdafx.cpp
1> LambdaTemplates.cpp
1>c:\program files (x86)\microsoft visual studio 14.0\vc\include\algorithm(2709): error C2664: 'bool main::<lambda_79759dd0460f5d162e02d2bb1cee5db7>::operator ()(vector_test *,std::string) const': cannot convert argument 1 from 'const std::string' to 'vector_test *'
1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\algorithm(2709): note: No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1> c:\users\skilz80\documents\visual studio 2015\projects\stackoverflowsolutions\lambdatemplates\lambdatemplates.cpp(45): note: see reference to function template instantiation 'bool std::binary_search<std::_Vector_iterator<std::_Vector_val<std::_Simple_types<vector_test *>>>,std::string,main::<lambda_79759dd0460f5d162e02d2bb1cee5db7>>(_FwdIt,_FwdIt,const _Ty &,_Pr)' being compiled
1> with
1> [
1> _FwdIt=std::_Vector_iterator<std::_Vector_val<std::_Simple_types<vector_test *>>>,
1> _Ty=std::string,
1> _Pr=main::<lambda_79759dd0460f5d162e02d2bb1cee5db7>
1> ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
非常によく似たエラー メッセージが表示されます。バイナリ検索を呼び出すコード行をコメントアウトして、コンパイラのエラーメッセージを確認しましょう...
auto myLambda = []( vector_test* ptr, std::string name ) {
return name < ptr->get_name();
};
/*auto it = std::binary_search( test.begin(), test.end(), name, myLambda );
if (it)
std::cout << "It is here\n";
else
std::cout << "It is NOT here\n";
*/
これで、コンパイラ エラーは発生しなくなりました。binary_search()
したがって、ラムダ自体は問題ありませんが、関数内で起こっていることは次のとおりです。
2 つの前方反復子begin
とend
、検索語または値name
であるstd::string
. 前方反復子は のベクトルですvector_test pointers
。いわばラムダが間違っているわけではありません。関数が検索クエリのデータ型からオブジェクトstd::string
へのポインターを含むベクターに変換できないため、使用するラムダの型が間違っているだけです。 vector_test
、または間違った検索パラメータです。オブジェクトのクラスはvector_test
、std::string に変換するためのコンストラクターや変換係数、またはオーバーロードされた演算子を提供しません。また、コンテナを使用する際の補足として、binary_search
事前に分類する必要があります。