Разрешение указателя на функцию-член


Вот функтор, используемый для фильтрации списка объектов. Он должен быть создан с помощью указателя на функцию-член класса объектов, как способ доступа к различным элементам.

class Filter_Compare : public Filter {
    std::string (File::*fun)();
public:
    Filter_Compare(const char *name, const char *desc, std::string (File::*f)())
        : Filter(name, desc), fun(f)
    {}
    ~Filter_Compare() {};

    int operator () (File* f1, File* f2) { return this->eval(*f1, *f2); }
    int eval(File* f1, File* f2) const { return this->eval(*f1,*f2); }

    int eval(File& f1, File& f2) const {
        return f1.*(this->fun()).compare(f2.*(this->fun()));
    }
};
//an instanciation example :
Filter_Compare fname("Name", "Compare by name", File::getPath);

И g++ возвращает следующие ошибки:

Фильтр.h: в функции-члене ' int Filter_Compare:: eval(File&, File&) const’: фильтр.h: 48: 27: ошибка: должен использовать ‘. ' или '- > ' для вызова указатель на функцию-член в ‘((const Filter_Compare*)этого)->Filter_Compare::удовольствие (...)’, например ‘(... - >* ((константный Filter_Compare*)этого)->Filter_Compare::забава) (...)’ Фильтр.h: 48: 53: ошибка: должен использовать ‘. ' или '- > ' для вызова функции указателя на член в ‘((const Filter_Compare*)этого)->Filter_Compare::удовольствие (...)’, например ‘(... - >* ((константный Filter_Compare*)этого)->Filter_Compare::забава) (...) '

Я не вижу здесь проблемы, так как я уже использовал это на другом классе без какой-либо ошибки (ну, по крайней мере, он компилируется, я не мог запустить его прямо сейчас), где код:

Lit_type eval (File& f) const { возвращение F.*(эта->удовольствие()) - thValue; }

Что именно здесь не так ? Я не знаю, как я мог бы сделать ссылку на указатель другим способом. Спасибо!

2 2

2 ответа:

Скобки неправильные:

int eval(File& f1, File& f2) const {
    return (f1.*fun)().compare((f2.*fun)());
}

Для вызова через указатель на функцию-член вы используете .* или ->*. Чтобы вызвать fun на File& f1, вызов будет (f1.*fun)(). Итак: (f1.*fun)().compare((f2.*fun)()). Если вы хотите усложнить выражение с помощью явных this->s, которые не нужны, вы должны быть особенно осторожны: (f1.*(this->fun))().compare((f2.*(this->fun))()).