C ++:带有STL的错误C2064

时间:2010-07-29 22:03:42

标签: c++ stl compiler-errors

我正在尝试使用STL,但以下内容无法编译。的的main.cpp

#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);
}

错误是:

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>          ]

我做错了什么?

3 个答案:

答案 0 :(得分:3)

需要声明为static:

static bool IsOdd(int i)

否则,您要求find_if在没有实例的情况下调用实例方法。

答案 1 :(得分:1)

问题是你正在传递一个指向成员函数的指针。要调用该函数,您还需要一个指向此函数的指针,但find_if不允许您传递它。解决方案是使用函数对象包装它,请参阅Boost Bind(http://www.boost.org/doc/libs/1_43_0/libs/bind/bind.html)和Boost Function(http://www.boost.org/doc/libs/1_37_0/doc/html/function.html)。

答案 2 :(得分:1)

IsOdd不以任何方式使用类的内部,因此不要使它成为成员函数。相反,将其作为独立功能拉出来。然后,您可以使用find_if致电&IsOdd

然而,将事情更进一步并将其定义为函数对象是有益的:

#include <functional>

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

然后使用find_if调用IsOdd()内联find_if循环中的代码,而不是取消引用函数指针并进行函数调用。