3

で使用されているメソッドstd::bindにバインドするために使用しようとしていますthisQtConcurrent::blockingMapped

ヘッダ:

class TuringMachine
{
private:
    TRTable table;
    std::set<ConfigNode*> currentConfigs;

    //function object
    std::function<std::set<ConfigNode*>( const TuringMachine*, ConfigNode*)> step_f;
    //method it will hold
    std::set<ConfigNode *> step(TuringMachine* this_m ,ConfigNode *parent);

    std::set<ConfigNode*>& makeStep();

}

ソース:

    TuringMachine::TuringMachine(/**/)  
{

    step_f = std::bind(&TuringMachine::step, this, std::placeholders::_1);
}

std::set<ConfigNode*> &TuringMachine::makeStep(){

    auto configSet = QtConcurrent::blockingMapped<QLinkedList<std::set<ConfigNode*>>>(currentConfigs, step_f);//concurrent execution!

   /**/ 
   return currentConfigs;
}
std::set<ConfigNode*> TuringMachine::step(TuringMachine *this_m, ConfigNode * parent){     //the actual step
  /**/
}

したがって、ここでImが行っているのはblockingMapped、のそれぞれConfigNodeで同時にステップを実行することcurrentConfigsです。std::bindにバインドthisするために使用してstepいるので、のドキュメントのように、必要な引数は1つだけですblockingMapped

私は得ています

error: no match for call to '(std::_Bind<std::_Mem_fn<std::set<ConfigNode*> (TuringMachine::*)(TuringMachine*, ConfigNode*)>(TuringMachine*, std::_Placeholder<1>)>) (const TuringMachine*, ConfigNode*)'
.../Qt/474/gcc/include/QtCore/qtconcurrentmapkernel.h:121: error: no match for call to '(std::function<std::set<ConfigNode*>(const TuringMachine*, ConfigNode*)>) (ConfigNode* const&)'
.../Qt/474/gcc/include/QtCore/qtconcurrentmapkernel.h:136: error: no match for call to '(std::function<std::set<ConfigNode*>(const TuringMachine*, ConfigNode*)>) (ConfigNode* const&)'

note: 2 arguments expected, 1 provided

どこで私は間違えましたか?

編集

修正された作業バージョン(将来の「参照」用):

ヘッダ:

    //function object
    std::function<std::set<ConfigNode*>( ConfigNode*)> step_f;
    //method it will hold
    std::set<ConfigNode *> step(ConfigNode *parent);

ソース:

    TuringMachine::TuringMachine(/**/)  
{
    step_f = std::bind(&TuringMachine::step, this, std::placeholders::_1);
}
4

1 に答える 1

3

メンバー関数をバインドする場合は、ポインターを渡す必要があります。これは、この場合、2つのポインターthisを渡す必要があることを意味します。this

メンバー関数への通常の呼び出し:

struct bar {
  int a;
  void foo() {
    std::cout << a << std::endl;
  }

  void call_yourself() {
     auto f = std::bind(&bar::foo, this);
     f();
  }
};

あなたの場合:

    step_f = std::bind(&TuringMachine::step, this, this,std::placeholders::_1);

あなたのコードを理解せずに、私はおそらくあなたがダブルthisポインタを避けることができるようにあなたのコードを再利用するでしょう。

于 2012-11-30T14:46:41.150 に答える