2013-10-19 128 views
1

我的下面的代碼給我編譯器錯誤,我不明白我在做什麼錯誤。任何人都可以幫忙嗎?std :: map與lambda比較器

基本上我所要做的就是通過引用一個函數來傳遞一個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; 
} 

我得到VS2012下面的編譯錯誤

錯誤1錯誤C2664: '富':無法從 '的std ::地圖< _Kty,_Ty,_Pr>' 轉換參數1爲「STD: :地圖< _Kty,_Ty,_Pr> &「d:\我的項目\ 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 
+0

Lambdas與std :: function無關。他們是他們自己的班級類型。 – WhozCraig

回答

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)); 
} 

這個工作對我的工具鏈, 「蘋果LLVM 5.0版(鐺 - 500.2.75)(基於LLVM 3.3svn)」。我沒有理由認爲它也不適用於你的工具鏈。

+0

我試過了,但它不能在VS2012上編譯。似乎它在gcc上工作。我在http://coliru.stacked-crooked.com/上試過 –

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說,lambda表達式不std::function;後者可以隱含地從前者構建,但它們不具有相同的類型。這意味着一個參數化的std::map與另一個參數化的std::map完全無關。