gpt4 book ai didi

c++ - std::map 与 lambda 比较器

转载 作者:行者123 更新时间:2023-11-30 04:13:16 28 4
gpt4 key购买 nike

我下面的代码给我编译器错误,我不明白我在做什么错。有人可以帮忙吗?

基本上我想做的就是通过引用一个函数来填充一个 STL map 容器。这个 map 容器还有一个与之关联的比较器 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;
}

我在 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

最佳答案

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)”。我认为没有理由它也不能与您的工具链一起使用。

关于c++ - std::map 与 lambda 比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19461355/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com