2016-08-26 125 views
0

我想創建一個std :: function的映射,然後試圖綁定它的幾個參數,但它給出了一個錯誤。 所以,我的std ::函數的定義是如何使用std :: bind與std :: function和std :: map

using abc = std::function<double(const double& t1, const double& t2)>; 

和地圖是

std::map<std::pair<std::string, std::string>, abc> conversion_; 

我想在這個地圖中插入的方式是

conversion_.emplace(
      std::make_pair("a", "b"), 
      std::bind(conversion, 3, std::placeholders::_1)); 

conversion_.find(std::make_pair("a", "b"))->second(4); -- Access 

我已經定義了函數轉換,但是當我試圖訪問該函數時,它會給出以下錯誤

error: no match for call to ‘(const std::function<double(const double&, const double&)>) (int)’ 

添加全碼: 轉換函數在一個單獨的文件中定義:其中我試圖限定地圖

namespace x 
{ 
    double conversion(const double& a, const double& b); 
} 

頭文件

namespace x 
{ 
    class main 
    { 
    public: 
     using abc = std::function<double(const double& t1, const double& t2)>; 
     main(); 
    private: 
     std::map<std::pair<std::string, std::string>, abc> conversion_; 
    }; 
} 

cpp文件

namespace x 
{ 
main::main() 
{ 
    conversion_.emplace(
     std::make_pair("a", "b"), 
     std::bind(conversion, 3, std::placeholders::_1)); 
    auto m = conversion_.find(std::make_pair("a", "b"))->second(4); 
} 
} 
+0

它看起來像'bind'不生成兼容對象。 「轉換」的聲明是什麼? –

+0

發佈**全部**代碼。你不能只是忽略這樣的關鍵細節,認爲它只是正確的。 –

+0

發佈[mcve]。例如,現在我們不知道「轉換」是什麼。但即使沒有它:你的'abc'是兩個參數的函數,但你只用一個參數來調用它。研究一下。 – Angew

回答

3

我猜conversion的功能是double(const double& t1, const double& t2)。如果是這樣,std::bind(conversion, 3, std::placeholders::_1)定義了一個仿函數,它需要一個參數doubleconversion的另一個參數被修復爲3)並返回double。您只需將abc修改爲std::function<double(const double& t1)>;

相關問題