#include<functional>
#include<list>
class A {
public: virtual bool isOdd(int x) = 0;
};
class B : public A {
public: bool isOdd(int x) override
{ return (x%2)!=0; }
};
int main () {
A *a = new B();
std::list<int> l {1,2,3,4};
l.remove_if (a->isOdd);
return 0;
}
Этот код вызывает следующую ошибку компилятора для l.remove_if (a->isOdd);:
reference to non-static member function must be called
Как я могу вызвать remove_if, чтобы вызывалась реализация isOdd класса B?
Я не ищу решение, которое напрямую ссылается на B::isOdd. Вместо этого я хочу иметь указатель на абстрактный класс A и несколько (не абстрактных) подклассов A и использовать реализацию любого производного класса, на который указывает указатель.
здесь вы смешиваете две ортогональные проблемы. Ошибка возникает из-за того, что remove_if ожидает функцию, которую он может вызвать (которая не является a->isOdd, и, к сожалению, ошибка немного вводит в заблуждение), а во-вторых, isOdd является виртуальным, но непонятно, зачем вам это нужно быть виртуальным или почему вы думаете это было бы проблемой
std::function<bool(int)> f = std::bind( &A::isOdd, a, _1 ); l.remove_if (f)Спасибо, @ Jarod42, я не думал использовать здесь лямбды.
@StephanLechner: Лучше использовать auto вместо типа стирания с ненужным std::function.





l.remove_if ([a](int n) {return a->isOdd(n); });.