2013-03-02 72 views
1

我想了解find_if功能如何工作的,我下面在此参考的例子:C++ 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'; 
    } 

谁能帮助我了解为什么这是怎么回事?

回答

5

A::isOdd需要是static方法。否则,它只能与特定的A一起使用。由于isOdd完全不依赖于成员字段,因此将其更改为static方法将会保存。更有甚者,因为它不依赖于类可言,你可以创建一个全局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; } 
); 
+1

+1为全局建议。这不是一门课程,一切都需要在课堂上进行,并从中获得收益。当然,另一种选择(除了一个非常相似的函子),希望是一个lambda,一个简单的'[](i){return i%2;}'。 – chris 2013-03-02 18:47:04

+0

我尝试了全球的建议,它的工作。谢谢! – FranXh 2013-03-02 20:14:24