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

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

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&, Файл&)
const ’: Filter.h: 48: 27: ошибка: необходимо использовать‘.’Или‘ ->‘ звонить
функция указателя на член в ‘((const
Filter_Compare *) this) -> Filter_Compare :: fun (…) ’, например ‘(… -> *
((const Filter_Compare *) this) -> Filter_Compare :: fun) (…) ’
Filter.h: 48: 53: ошибка: необходимо использовать ‘.’Или‘ ->Для вызова функции указателя на член в ‘((const
Filter_Compare *) this) -> Filter_Compare :: fun (…) ’, например ‘(… -> *
((const Filter_Compare *) this) -> Filter_Compare :: fun) (…) ’

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

lit_type eval (Файл& f) const {
return f. * (this-> fun ()) — thValue;
}

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

2

Решение

Скобки неверны:

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

Другие решения

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

1

По вопросам рекламы [email protected]