2016-08-26 23 views
0

std :: functionのマップを作成しようとしていて、いくつかのパラメータをバインドしようとしていますが、エラーが発生しています。 だから、私のstd ::関数定義はstd :: functionとstd :: mapでstd :: bindを使う方法

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

それは互換性のオブジェクトを生成していないように見えます。 「変換」の宣言は何ですか? –

+0

投稿**すべて**コードです。そのような重要な細部を省略することはできません。ちょうど正しいと思ってください。 –

+0

投稿する[mcve]。現在、私たちは '変換 'が何であるかを知らない。しかしそれがなくても、あなたの 'abc'は2つのパラメータの関数ですが、あなたはそれを1つだけ呼び出すことになります。それを見てください。 – Angew

答えて

3

conversionは、double(const double& t1, const double& t2)のように機能すると思います。その場合、std::bind(conversion, 3, std::placeholders::_1)は、1つの引数がdoubleconversionのもう1つの引数は3に固定されています)を必要とするファンクタを定義し、doubleを返します。あなたはただ変更する必要がありますabcstd::function<double(const double& t1)>;

関連する問題