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

C++:部分应用困难

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

    我正在尝试使用函数参数的部分应用程序,以便使用stl find_if . 下面是一个示例程序:(为了简洁起见,将类头和实现合并。)

    #include <functional>
    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <iostream>
    
    using namespace std;
    
    struct Odp
    {
        int id;
    
        Odp(int id)
        {
            this->id = id;
        }
    
        ~Odp()
        {
            cout << "Destructing Odp " << id << endl;
        }
    };
    
    typedef vector<Odp*> OdpVec;
    
    class Foo
    {
    public:
        void loadUp()
        {
            vec.push_back(new Odp(0));
            vec.push_back(new Odp(1));
            vec.push_back(new Odp(2));
        }
        void printWithID(int id)
        {
            OdpVec::iterator iter = find_if(vec.begin(), vec.end(), bind1st(&hasID, id));
            if (iter != vec.end())
            {
                cout << "Odp at " << *iter << " has id " << id << endl;
                return;
            }
            cout << "No Odp with id " << id << " could be found." << endl; 
        }
    
    private:
        OdpVec vec;
        bool hasID(int id, Odp* odp)
        {
            return odp->id == id;
        }
    };
    
    int main()
    {
        Foo foo;
        foo.loadUp();
        foo.printWithID(1);
    }
    

    然而,这甚至不能编译。错误是:

    error C2276: '&' : illegal operation on bound member function expression
    

    我在这里做错什么了?

    更新 制作 hasID() 自由浮动函数导致此错误:

    error C2664: 'std::find_if' : cannot convert parameter 3 from 'std::binder1st<_Fn2>' to 'std::binder1st<_Fn2>'
    1>          with
    1>          [
    1>              _Fn2=bool (__cdecl *)(int,Odp &)
    1>          ]
    1>          Cannot copy construct class 'std::binder1st<_Fn2>' due to ambiguous copy constructors or no available copy constructor
    1>          with
    1>          [
    1>              _Fn2=bool (__cdecl *)(int,Odp &)
    1>          ]
    
    2 回复  |  直到 14 年前
        1
  •  4
  •   EFraim    14 年前

    bind_1st应与 functors 不是成员函数。

    函数是一个带有重载运算符()的对象。

    你可以使用 mem_fn 围绕成员函数构造适配器。

    在你的情况下,因为hasid没有利用 this 只需使用静态方法就可以完成。(那你就不必拘束了 作为第一个论点)

        2
  •  0
  •   Dario    14 年前

    你必须做 hasID static 功能(或从 Foo 完全)。您希望在活页夹中有一个普通的函数指针,而不是指向 成员函数 .