C++ 带有lambda比较器的std::map

C++ 带有lambda比较器的std::map,c++,c++11,stl,lambda,C++,C++11,Stl,Lambda,我下面的代码给了我一个编译器错误,我不明白我做错了什么。有人能帮忙吗 基本上,我所要做的就是通过引用一个函数来传递一个STL映射容器,这个函数将填充它。这个映射容器还有一个与之关联的比较器lambda #include "stdafx.h" #include <functional> #include <map> using namespace std; typedef struct _tagAddressBook { string strFirstName;

我下面的代码给了我一个编译器错误,我不明白我做错了什么。有人能帮忙吗

基本上,我所要做的就是通过引用一个函数来传递一个STL映射容器,这个函数将填充它。这个映射容器还有一个与之关联的比较器lambda

#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;
}
#包括“stdafx.h”
#包括
#包括
使用名称空间std;
typedef结构\u标记地址簿
{
字符串strFirstName;
字符串strLastName;
长nZipCode;
}通讯录;
void foo(地图和myAddressBook)
{
AddressBookAddressBookInstance;
addressBookInstance.strFirstName=“Bob”;
addressBookInstance.strLastName=“Parker”;
addressBookInstance.nZipCode=12345;
插入(std::pair(addressBookInstance.strFirstName,addressBookInstance));
}
int _tmain(int argc,_TCHAR*argv[]
{

auto myComparator=[](const string&strLeft,const string&strRight){return(strLeft.compare(strRight)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));
}
模板
void foo(地图和myAddressBook)
{
AddressBookAddressBookInstance;
addressBookInstance.strFirstName=“Bob”;
addressBookInstance.strLastName=“Parker”;
addressBookInstance.nZipCode=12345;
插入(std::pair(addressBookInstance.strFirstName,addressBookInstance));
}
这适用于我的工具链“Apple LLVM 5.0版(clang-500.2.75)(基于LLVM 3.3svn)”。我看不出它也适用于你的工具链的原因。

请使用别名:

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

正如Whoz所说,lambda不是
std::function
;后者可以从前者隐式构造,但它们没有相同的类型。这意味着一个参数化的
std::map
与另一个参数化的
std::map
完全无关。

lambda与std::function没有任何关系。它们是他们自己的类类型。可能与我尝试过的类类型相同,但它在VS2012上无法编译。它似乎在gcc上工作。我尝试过
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;
}