1

以下のコードでコンパイラ エラーが発生し、何が間違っているのか理解できません。誰でも助けてもらえますか?

基本的に私がやろうとしているのは、それを埋める関数への参照によってSTLマップコンテナを渡すことだけです。このマップ コンテナには、コンパレータ ラムダも関連付けられています。

#include "stdafx.h"
#include <functional>
#include <map>

using namespace std;

typedef struct _tagAddressBook
{
  string strFirstName;
  string strLastName;
  long nZipCode;
} AddressBook;

void foo(map<string, AddressBook, function<bool(const string&, const string&)>> &myAddressBook)
{
  AddressBook addressBookInstance;
  addressBookInstance.strFirstName = "Bob";
  addressBookInstance.strLastName = "Parker";
  addressBookInstance.nZipCode = 12345;

  myAddressBook.insert(std::pair<string, AddressBook>(addressBookInstance.strFirstName, addressBookInstance));
}

int _tmain(int argc, _TCHAR* argv[])
{
  auto myComparator = [] (const string &strLeft, const string &strRight) { return(strLeft.compare(strRight) <= 0 ? true : false); };
  map<string, AddressBook, decltype(myComparator)> myAddressBook(myComparator);

  foo(myAddressBook);

    return 0;
}

VS2012 で以下のコンパイル エラーが発生します。

エラー 1 エラー C2664: 'foo': パラメーター 1 を 'std::map<_Kty,_Ty,_Pr>' から 'std::map<_Kty,_Ty,_Pr> &' d:\my projects\mapwithlambdacomparator\ に変換できませんmapwithlambdacomparator\mapwithlambdacomparator.cpp 32

2   IntelliSense: a reference of type "std::map<std::string, AddressBook, std::function<bool (const std::string &, const std::string &)>, std::allocator<std::pair<const std::string, AddressBook>>> &" (not const-qualified) cannot be initialized with a value of type "std::map<std::string, AddressBook, lambda []bool (const std::string &strLeft, const std::string &strRight)->bool, std::allocator<std::pair<const std::string, AddressBook>>>" d:\My Projects\MapWithLambdaComparator\MapWithLambdaComparator\MapWithLambdaComparator.cpp  32
4

2 に答える 2

1

エイリアスを作成してください:

using AdressBookMap = map<string, AddressBook, function<bool(const string&, const string&)>>;

次に、それを使用します。

void foo(AddressBookMap& myAddressBook)
{
    // ...
}

int main(int argc, char* argv[])
{
    auto myComparator = [] (...) { ... };
    AddressBookMap myAddressBook(myComparator);

    foo(myAddressBook);

    return 0;
}

Whozが言ったように、ラムダはそうではありませんstd::function。後者は前者から暗黙的に構築できますが、同じ型はありません。これは、std::map一方によってパラメータ化されたものは、他方によってパラメータ化されたものとはまったく無関係であることを意味しstd::mapます。

于 2013-10-19T02:46:37.533 に答える
1

Lambda 関数は とは関係ありませんstd::function。実際、それぞれが独自のクラス タイプです。見た目どおりのことをしたい場合は、テンプレートを使用してそれを実行し、foo推論に任せることができます。

template <typename Cmp>
void foo(map<std::string, AddressBook, Cmp> &myAddressBook)
{
    AddressBook addressBookInstance;
    addressBookInstance.strFirstName = "Bob";
    addressBookInstance.strLastName = "Parker";
    addressBookInstance.nZipCode = 12345;

    myAddressBook.insert(std::pair<string, AddressBook>(addressBookInstance.strFirstName, addressBookInstance));
}

これは、私のツールチェーン「Apple LLVM バージョン 5.0 (clang-500.2.75) (LLVM 3.3svn に基づく)」で動作します。ツールチェーンでも機能しない理由はわかりません。

于 2013-10-19T01:44:09.687 に答える