Ошибки C3867 и C2672

При попытке компиляции выдает ошибки:

1.Ошибка C3867 "Zadanie::operator ()": нестандартный синтаксис; используйте "&", чтобы создать указатель на член

2.Ошибка C2672 "replace_if": не найдена соответствующая перегруженная функция
Если убрать operator() из функции и поставить sravni_10, то всё работает. Но мне это нужно сделать через функтор. Заранее спасибо.

#include <iostream>
#include <algorithm>
#include <vector>
#include <ctime>
#include <functional>


using namespace std;

class Zadanie {
    const int amount = 10;//количество элементов в векторе
    vector<int> vec;
public:
    Zadanie();

    bool operator ()(int& a);
    void view();
    void multiplication();
    void removing();
    void zamena();
};

bool sravni(int& a) {
    return a == 0;
}

bool sravni_10(int& a) {
    return abs(a) > 10;
}

void Zadanie::removing() {
    vector<int>::iterator Iter1, Iter2, new_end;
    new_end = remove(vec.begin(), vec.end(), 0);
    remove(new_end, vec.end(), 0);
    vec.erase(new_end, vec.end());
}

void Zadanie::zamena() {
    replace_if(vec.begin(), vec.end(), Zadanie::operator(), 0);
}

int umnozhenie(const int& a) {
    return a * 2;
}

void Zadanie::view() {
    for (auto i = vec.begin(); i != vec.end(); i++) {
        cout << *i << "  ";
    }
    cout << endl;
}


bool Zadanie::operator()(int& a) {
    return abs(a) > 10;
    /*while (i < vec.end()) {


    }

    return vec * 2;

    while (i < vec.end()) {

    }
    for (int i = 0; i < amount; i++) {
        vec[i] = vec[i] * 2;
        return vec[i];
    }*/
    //return 0;
}

void Zadanie::multiplication() {
    transform(vec.begin(), vec.end(), vec.begin(),umnozhenie);
}

Zadanie::Zadanie() {
    vec.resize(amount);
    srand(time(NULL));
    generate(vec.begin(), vec.end(), []()->int {return  (-10) + rand() % (abs(10) + abs(-10) + 1); });
}

int main() {
    system("color F1");
    setlocale(LC_ALL, "RUSSIAN");
    int choice = 0;
    Zadanie d;
    while (1) {
        cout << "Массив: \n";
        d.view();
        cout << "1-Умножить все элементы на 2\n" <<
            "2-Заменить все элементы, абсолютное значение которых больше 10 на 0\n" <<
            "3-Удалить из массива все значения, равные 0\n4-Выход\n";
        cin >> choice;
        switch (choice) {

        case 1:
            d.multiplication();
            break;

        case 2:
            d.zamena();
            break;

        case 3:
            d.removing();
            break;

        case 4:

            return 0;
        }
    }
}

Ответы (1 шт):

Автор решения: Harry

Через функтор — это примерно так (делам функтор отдельно):

struct Comp10
{
    bool operator()(const int& a) { return abs(a) > 10; }
};


void Zadanie::zamena() {
    replace_if(vec.begin(), vec.end(), Comp10(), 0);
}

Или так, если навешиваете на один класс всё, что только можно, в том числе сделали его функтором — ну и передавайте его в функцию:

void Zadanie::zamena() {
    replace_if(vec.begin(), vec.end(), *this, 0);
}

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

Но вообще по коду есть вопросы. Ну, например:

new_end = remove(vec.begin(), vec.end(), 0);
remove(new_end, vec.end(), 0);
vec.erase(new_end, vec.end());

Что тут делает средняя строчка?

→ Ссылка