1

私は find_if 関数がどのように機能するかを理解しようとしており、このリファレンスの例に従っています:

http://www.cplusplus.com/reference/algorithm/find_if/

上記の参考文献に示されている例に従うと、つまり main() を使用すると、すべて正常に動作します。しかし、その例をクラス内に含めようとすると (以下に示すように)、コンパイル時に次のエラーが発生します。

error: argument of type ‘bool (A::)(int)’ does not match ‘bool (A::*)(int)’

私のクラス内:

 bool A::IsOdd (int i) {
  return ((i%2)==1);
}


void A::function(){
   std::vector<int> myvector;

   myvector.push_back(10);
   myvector.push_back(25);
   myvector.push_back(40);
   myvector.push_back(55);

   std::vector<int>::iterator it = std::find_if (myvector.begin(), myvector.end(), IsOdd);
   std::cout << "The first odd value is " << *it << '\n';
  }

なぜこれが起こっているのかを理解するのを手伝ってくれる人はいますか?

4

1 に答える 1

5

A::isOddメソッドである必要がありますstatic。それ以外の場合は、特定の と組み合わせてのみ使用できますAisOddメンバ フィールドにはまったく依存しないので、メソッドに変更して保存しますstatic。さらに、クラスにまったく依存しないため、 global を作成するだけですisOdd:

bool isOdd(int i){
    return i % 2;
}

編集:クリスが示唆したように、単純なラムダ(C++ 11)を使用することもできます:

auto it = std::find_if (
     myvector.begin(), 
     myvector.end(),
     [](int i) -> bool{ return i % 2; }
);
于 2013-03-02T18:35:26.133 に答える