2013-12-12 23 views
0

我試圖通過使用std::for_each and boost::bindmap的所有密鑰複製到另一個。無法解析的超載與綁定和make_pair

我收到編譯錯誤說

error: no matching function for call to 
‘bind(<unresolved overloaded function type>, boost::arg<1>&, boost::arg<1>&)’ 

下面我的代碼。

using namespace boost; 
map<string,int32_t> A; 

typedef map<string,string> BType; 
BType B; 

std::for_each(A.begin(), A.end(), 
     bind(&BType::insert,&B,bind(&std::make_pair,_1,_1))); 

你知道什麼是錯的嗎?

+0

試'的std :: make_pair <字符串,字符串>' – Raxvan

+0

和'_1'你的情況是'的std ::對',而不僅僅是'string' –

+0

更改'std :: make_pair'之後,您的'bind'調用將創建一個試圖將函數對象插入'B'的無函數對象。 – Simple

回答

3

關鍵問題是你不能接受一個超載集的地址:std::make_pair是一個函數模板,你甚至沒有說明你在說什麼實例化。類似地,std::map<K, V>::insert過載,例如,採用一個元素的版本和採用範圍的版本。

即使您可以採用某種形式的重載函數的地址,但實際上並不真的想要如果您能幫到它!原因是通過函數指針或成員函數指針進行調用比調用函數指針要花費多得多,並且通過函數指針進行調用更加困難:編譯器必須證明特定的[成員]函數指針始終引用到相同的[成員]功能。

解決這兩個問題的方法是給bind()一個帶有模板函數調用操作符的函數對象,它簡單地委託給相應的函數。例如:

struct make_a_pair { 
    template <typename T0, typename T1> 
    std::pair<T0, T1> operator()(T0&& t0, T1&& t1) { 
     return std::make_pair(std::forward<T0>(t0), std::forward<T1>(t1)); 
    } 
}; 

當使用C++ 03你會使用T0 const&T1 const&代替T0&&T1&&和你只是傳遞,而不是使用std::forward<>()的參數。在C++ 11設置中,您可能更願意使用decltype()返回類型。插入一個類似的函數對象看起來是這樣的:

struct inserter { 
    template <typename M, typename T> 
    void operator()(M* map, T&& value) { 
     map->insert(std::forward<T>(value)); 
    } 
}; 

有了這兩個函數對象,你可以用你的bind()表達式:

std::for_each(A.begin(), A.end(), 
    boost::bind(inserter(), &B, boost::bind(make_a_pair(), _1, _1))); 

現在我不能很容易地測試這一點,但假設成對的_1_1是理想的。看來,你真的想創建的關鍵,在這種情況下,你需要適當項目的初始地圖,例如按鍵的鍵的映射關係,使用另一個函數對象:

struct project1st { 
    template <typename T0, typename T1> 
    typename std::remove_const<T0>::type 
    operator()(std::pair<T0, T1> const& p) const { 
     return p.first; 
    } 
}; 

這個函數對象如果有第一個T0,則從const中刪除const(如果該對來自std::map<K, V>,則該對將是std::pair<K const, V>),然後返回結果。你會使用這個函數對象合適std::bind()表達,即替換每個_1,與

boost::bind(project1st(), _1) 
+0

還有一個問題:for_each也在處理對...所以'make_a_pair(),_1,_1'被調用兩對字符串/ int ... – Johan

+0

@Johan:呃,是的。爲了解決這個問題,需要將'_1'投影到合適的值。我會更新答案,並提及這一部分。 –