2010-07-29 6 views
0

J'essaie d'utiliser STL, mais ce qui suit ne compile pas. main.cpp:C++: Erreur C2064 avec STL

#include <set> 
#include <algorithm> 

using namespace std; 

class Odp 
{ 
public: 

    set<int> nums; 

    bool IsOdd(int i) 
    { 
     return i % 2 != 0; 
    } 

    bool fAnyOddNums() 
    { 
     set<int>::iterator iter = find_if(nums.begin(), nums.end(), &Odp::IsOdd); 
     return iter != nums.end(); 
    } 
}; 

int main() 
{ 
    Odp o; 
    o.nums.insert(0); 
    o.nums.insert(1); 
    o.nums.insert(2); 
} 

L'erreur est:

error C2064: term does not evaluate to a function taking 1 arguments 
1>   c:\program files\microsoft visual studio 10.0\vc\include\algorithm(95) : see reference to function template instantiation '_InIt std::_Find_if<std::_Tree_unchecked_const_iterator<_Mytree>,_Pr>(_InIt,_InIt,_Pr)' being compiled 
1>   with 
1>   [ 
1>    _InIt=std::_Tree_unchecked_const_iterator<std::_Tree_val<std::_Tset_traits<int,std::less<int>,std::allocator<int>,false>>>, 
1>    _Mytree=std::_Tree_val<std::_Tset_traits<int,std::less<int>,std::allocator<int>,false>>, 
1>    _Pr=bool (__thiscall Odp::*)(int) 
1>   ] 
1>   main.cpp(20) : see reference to function template instantiation '_InIt std::find_if<std::_Tree_const_iterator<_Mytree>,bool(__thiscall Odp::*)(int)>(_InIt,_InIt,_Pr)' being compiled 
1>   with 
1>   [ 
1>    _InIt=std::_Tree_const_iterator<std::_Tree_val<std::_Tset_traits<int,std::less<int>,std::allocator<int>,false>>>, 
1>    _Mytree=std::_Tree_val<std::_Tset_traits<int,std::less<int>,std::allocator<int>,false>>, 
1>    _Pr=bool (__thiscall Odp::*)(int) 
1>   ] 

Qu'est-ce que je fais mal?

Répondre

3

Il doit être déclaré statique:

static bool IsOdd(int i) 

Sinon, vous demanderiez find_if d'appeler une méthode d'instance sans une instance.

1

IsOdd n'utilise en aucun cas les composants internes de la classe, ne le placez donc pas dans une fonction membre. Au lieu de cela, sortez-le comme une fonction autonome. Ensuite, vous pouvez appeler find_if avec &IsOdd.

Cependant, il y a un avantage à prendre les choses un peu plus loin et définir comme un objet de fonction:

#include <functional> 

struct IsOdd : public unary_function<int, bool> 
{ 
    bool operator()(int i) const { return i % 2 != 0; } 
}; 

ensuite appeler find_if avec IsOdd() sera en ligne le code dans la boucle find_if au lieu de déréférencement une pointeur de fonction et faire un appel de fonction.