2016-08-26 93 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)>;

相关问题