Почему для моего вызова mem_fun_ref нет «функции соответствия»? - PullRequest
3 голосов
/ 26 мая 2011

У меня есть некоторый код, где классы наследуются от базового класса.

В этом базовом классе есть функция, которая при запуске должна вызывать функции, которые должны быть реализованы дочерними элементами. То есть общий алгоритм одинаков для всех детей, но реализация шагов должна быть разной.

template<class T>
class Foo
{
    public:
        Foo(T y):y(y) { for(int i; i < 10; ++i) x.push_back(i); };
    protected:
        virtual bool IsOk(T, int)=0;
        void Run()
        {
            vector<int>::iterator it, bound;
            for(int i; i < 10; ++i)
            {
                cout << "step " << i << endl;
                bound = partition(x.begin(), x.end(), bind2nd(mem_fun_ref(&Foo<T>::IsOk), i));
                for (it=x.begin(); it!=bound; ++it)
                    cout << "  " << *it;
            };
        };
    private:
        vector<int>x;
        T y;
};

class Bar : public Foo<int>
{
    public:
        Bar():Foo<int>(50){this->Run();};
        bool IsOk(int x , int y) {return x == y;}

};

Однако, когда я это делаю, я получаю следующее сообщение об ошибке: no matching function for call to 'mem_fun_ref(bool (Foo<int>::*)(int, int))'

Может ли кто-нибудь дать мне некоторое представление о том, что я делаю вонг?

Ответы [ 2 ]

3 голосов
/ 26 мая 2011

mem_fun_ref работает только для функций с одним аргументом или без него.Для реализации того, что вы имеете в виду, вам придется использовать boost::bind (часть стандартной библиотеки в C ++ 0x).

0 голосов
/ 26 мая 2011

Ниже приведены проотипы для mem_fun_ref

template <class S, class T>
  mem_fun_ref_t<S,T> mem_fun_ref (S (T::*f)());

template <class S, class T, class A>
  mem_fun1_ref_t<S,T,A> mem_fun_ref (S (T::*f)(A));

template <class S, class T>
  const_mem_fun_ref_t<S,T> mem_fun_ref (S (T::*f)() const);

template <class S, class T, class A>
  const_mem_fun1_ref_t<S,T,A> mem_fun_ref (S (T::*f)(A) const);

Ваш mem_fun_ref(bool (Foo<int>::*)(int, int)) не соответствует ни одному из них и, следовательно, ошибка.

...