C ++: ошибка C2064 с STL - PullRequest
       17

C ++: ошибка C2064 с STL

0 голосов
/ 30 июля 2010

Я пытаюсь использовать 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 ]

3 голосов
/ 30 июля 2010

Должен быть объявлен статическим:

static bool IsOdd(int i)

В противном случае вы бы попросили find_if вызвать метод экземпляра без экземпляра.

1 голос
/ 30 июля 2010

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 вместо разыменования указателя функции и выполнения вызова функции.

1 голос
/ 30 июля 2010

Проблема в том, что вы передаете указатель на функцию-член.Для вызова этой функции вам также понадобится указатель на нее, но 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).

)
...