Ошибки 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 шт):
Через функтор — это примерно так (делам функтор отдельно):
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());
Что тут делает средняя строчка?