4

クラスメソッドを関数に渡そうとしていますが、「関数呼び出しに引数リストがありません。「&」を使用してメンバーへのポインターを作成してください」というエラーが発生します。

//There is some class
class A {
  int someField;
  void Add(int someAdd) {
    someField += someAdd;
  }
}

//And function
void someFunc(std::function<void(int x)> handler) {
  //Some code
  handler(234);
}

//Class method pass to function
void main() {
  A* instanceA = new A();
  someFunc(instanceA->Add); //Error 19  error C3867: 'A::Add': function call missing argument list; use '&A::Add' to create a pointer to member
}

どうしたの?

4

3 に答える 3

10

C ++には、言語構造としてバインドされたメソッドがありません。書く:

someFunc(std::bind(&A::Add, instanceA, std::placeholders::_1));
于 2013-02-04T10:18:38.693 に答える
3

後でパラメーターを渡すときに、プレースホルダーでstd::bindを使用する必要があります。

#include <functional>
someFunc(std::bind(&A::Add, instanceA, std::placeholders::_1));

A::Addまた、公開する必要があることに注意してください

class A {    
  int someField;

public:
  void Add(int someAdd) {
    someField += someAdd;
  }
};

また、C++ 標準では no であることに注意してください。void main

int main() 
{
    someFunc(std::bind(&A::Add, instanceA, std::placeholders::_1));
}
于 2013-02-04T10:22:34.000 に答える
1

他の回答の代わりに、std::bindラムダの使用法を提案したいと思います。ラムダははるかに読みやすいからです。

int main() {
  A* instanceA = new A();
  someFunc([=](int a1, int a2)
  {
    instanceA->Add(a1, a2);
  }); 
}   

Add が 4 つ、5 つ、...「BigN」パラメーターを取ると、ラムダのパラメーター リストでそれらすべてを繰り返す必要があるため、長くなりますが、もちろん、きれいなコードを書く方法を知っていて、提供しないAdd「BigN」パラメータ付き;-)

于 2013-02-04T13:47:38.523 に答える