代码之家  ›  专栏  ›  技术社区  ›  Nick Heiner

C++与STL的错误C2064

  •  0
  • Nick Heiner  · 技术社区  · 14 年前

    我正在尝试使用STL,但以下内容无法编译。 主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 回复  |  直到 14 年前
        1
  •  3
  •   Matthew Flaschen    14 年前

    它需要声明为静态:

    static bool IsOdd(int i)
    

    否则,你会问 find_if 调用没有实例的实例方法。

        2
  •  1
  •   Karel Petranek    14 年前

    问题是您正在向成员函数传递指针。要调用这个函数,您还需要一个指向这个函数的指针,但是find-if不允许您传递它。解决方案是使用函数对象包装它,请参见boost bind( http://www.boost.org/doc/libs/1_43_0/libs/bind/bind.html )和增强功能( http://www.boost.org/doc/libs/1_37_0/doc/html/function.html )

        3
  •  1
  •   Jon Reid    14 年前

    IsOdd 不要以任何方式使用类的内部结构,所以不要将其作为成员函数。相反,将它作为一个独立的函数拉出。然后你可以打电话 find_if 具有 &IsOdd .

    但是,将事物进一步定义为函数对象有一个好处:

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

    然后打电话 芬迪夫 具有 IsOdd() 内嵌代码 芬迪夫 循环而不是取消对函数指针的引用并进行函数调用。