2012-03-08 65 views
0

我想用boost::bind創建一個boost::function插入一個新的鍵值對到一個boost::unoredered_map,但我得到了一些編譯錯誤。下面boost :: bind並插入一個boost :: unordered_map

​​

錯誤看起來像bind找不到unordered_map::insert正確的過載。在這種情況下,我指定了正確的重載,但這次不起作用。你知道這是什麼嗎?

../include2/llve_clorder_id.h:32: error: no matching function for call to 
'bind(<unresolved overloaded function type>, 
boost::unordered_map<std::basic_string<char, std::char_traits<char>, 
std::allocator<char> >, std::basic_string<char, std::char_traits<char>, 
std::allocator<char> >, boost::hash<std::basic_string<char, std::char_traits<char>, 
std::allocator<char> > >, std::equal_to<std::basic_string<char, std::char_traits<char>, 
std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, 
std::char_traits<char>, std::allocator<char> >, std::basic_string<char, 
std::char_traits<char>, std::allocator<char> > > > >&, const 
boost::reference_wrapper<const std::pair<const std::basic_string<char, 
std::char_traits<char>, std::allocator<char> >, std::basic_string<char, 
std::char_traits<char>, std::allocator<char> > > >)' 
+0

請問您可以指定您的編譯器版本嗎?一些不懂部分專業化的較老的編譯器不能接受指向函數成員的指針作爲「boost :: bind」的第一個參數。 – 2012-03-08 18:23:12

回答

1

的問題是,boost::unordered_map包含不止一個insert,所以&dict_type::insert是模糊的。最簡單的辦法是定義一個函數來調用正確的過載:

void insert(dict_type & dict, dict_type::value_type const & value) { 
    dict.insert(value); 
} 

boost::function<void()> f = boost::bind( 
    insert 
    ,boost::ref(obj_) 
    ,boost::cref(to_insert) 
); 

,或者你可以指定明確的過載:

boost::function<void()> f = boost::bind( 
    static_cast<out_type (dict_type::*)(dict_type::value_type const &)>(&dict_type::insert) 
    ,obj_ 
    ,boost::cref(to_insert) 
); 

在C++ 11,就能避免問題拉姆達:

std::function<void()> f = [&](){obj_.insert(to_insert);}; 
+0

我錯了,說您的解決方案使用static_cast <>更快?通過使用static_cast <>,模糊性在編譯時被解析,所以即使編寫它的時間更長,也會使得調用綁定更快,不是嗎? – 2012-03-08 19:55:04

+0

理論上'static_cast'會更快(這與我的例子相當),但是一些編譯器可能能夠優化出平凡的功能,所以它們都可能產生相同的結果。 – 2012-03-08 20:05:19

+0

Auch ..我發現它..它應該是&obj作爲第二個參數 – 2012-03-09 11:00:06

1

http://www.boost.org/doc/libs/1_49_0/libs/bind/bind.html#Troubleshooting表明,有時可以通過鑄造指針到成員函數所需類型解決與重載函數的問題。使用臨時變量來阻止它成爲完全不可讀,它看起來像:

typedef std::pair<typename dict_type::iterator, bool> out_type; 

typename dict_type::value_type to_insert(key,value); 

out_type (dict_type::*ins) (typename dict_type::value_type const&) const = &dict_type::insert; 

boost::function<void()> f = boost::bind(
    ins 
    ,obj_ 
    ,boost::cref(to_insert) 
); 
+0

嗨丹。我閱讀你建議的頁面,現在我明白爲什麼綁定沒有工作。非常感謝。 – 2012-03-08 19:55:44