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

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

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 ++ возвращает эту ошибку:

Filter.h: в функции-члене 'int Filter_Compare :: eval (File &, File &) const': Filter.h: 48: 27: error: для вызова необходимо использовать '. ' или '->' функция указателя на член в '((const Filter_Compare *) this) -> Filter_Compare :: fun (...)', например '(... -> * ((const Filter_Compare *) this) -> Filter_Compare :: fun) (...)' Filter.h: 48: 53: error: необходимо использовать '. ' или '- > 'для вызова функции указателя на член в' ((const Filter_Compare *) this) -> Filter_Compare :: fun (...) ', например ‘(... -> * ((const Filter_Compare *) this) -> Filter_Compare :: fun) (...)’

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

lit_type eval (File & f) const {return f. * (this-> fun ()) - thValue; }

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


person 0xeedfade    schedule 13.12.2012    source источник


Ответы (2)


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

int eval(File& f1, File& f2) const {
    return (f1.*fun)().compare((f2.*fun)());
}
person David Rodríguez - dribeas    schedule 13.12.2012

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

person Pete Becker    schedule 13.12.2012
comment
Я тоже не думаю, что вы правильно поняли круглые скобки. Я считаю, что это должно быть (f1.*fun)() (т.е. () имеет приоритет над .*) - person David Rodríguez - dribeas; 14.12.2012
comment
@ DavidRodríguez-dribeas - наверное, ты прав. Вот что я получаю за то, что не компилирую код. Фиксированный. - person Pete Becker; 14.12.2012