2015-09-22 49 views
1

我想實現字符串和函數的映射 我已經把我的程序的片段。使用boost的字符串和函數的映射給出編譯錯誤

我有以下實施

void foo1(const std::string) 
void foo2(const std::string) 
void foo3(const std::string) 

typedef boost::function<void, const std::string> fun_t; 
typedef std::map<std::string, fun_t> funs_t; 
funs_t f; 

f["xyz"] = &foo1; 
f["abc"] = &foo2; 
f["pqr"] = &foo3; 

std::vector<std::future<void>> tasks; 

for(std::string s: {"xyz", "abc", "pqr"}){ 

tasks.push_back(std::async(std::launch::async, f.find(f_kb)->second, s)); 

} 

for(auto& task : tasks){ 
    task.get(); 
} 

它給我的錯誤就從這裏

usr/local/include/boost/function/function_template.hpp225:18: error: no match for call to '(boost::_mfi::mf1<void, Class sample, std::basic_string<char>>)(const std::basic_string<char> &)' 

BOOST_FUNCTION_RETURN(boost::mem_fn(*f)(BOOST_FUNCTION_ARGS)); 

需要有人能告訴我什麼是錯的代碼行

f["xyz"] = &foo1; 

+0

似乎缺少一些分號。 – owacoder

+1

「沒有匹配的呼叫」到什麼?你忘了複製/粘貼錯誤信息嗎? –

+0

嗨..我編輯的問題很抱歉模糊 –

回答

1

我認爲對function<>的評論是正確的。

這裏是你的樣品固定起來工作:

Live On Coliru

#include <boost/function.hpp> 
#include <future> 
#include <map> 
#include <iostream> 

void foo1(std::string const& s) { std::cout << __PRETTY_FUNCTION__ << "(" << s << ")\n"; } 
void foo2(std::string const& s) { std::cout << __PRETTY_FUNCTION__ << "(" << s << ")\n"; } 
void foo3(std::string const& s) { std::cout << __PRETTY_FUNCTION__ << "(" << s << ")\n"; } 

typedef boost::function<void(std::string const&)> fun_t; 
typedef std::map<std::string, fun_t> funs_t; 

int main() { 
    funs_t f; 

    f["xyz"] = &foo1; 
    f["abc"] = &foo2; 
    f["pqr"] = &foo3; 

    std::vector<std::future<void>> tasks; 

    for(std::string s: {"xyz", "abc", "pqr"}){ 

     tasks.push_back(std::async(std::launch::async, f.find(s)->second, s)); 

    } 

    for(auto& task : tasks){ 
     task.get(); 
    } 
} 

版畫一樣的東西:

void foo3(const string&)(pqr) 
void foo2(const string&)(abc) 
void foo1(const string&)(xyz) 

(輸出取決於線程的調度,這是實施定義和非確定性)

+0

我不知道Coliru支持Boost。Cool!:) –

+0

謝謝@sehe乾淨整潔。 –