Привильный синтаксис для вызова sort() c++ в классе
Поробовал написать класс для сортировки вектора векторов по определенному полю
#pragma once
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
class Sorter
{
private:
int numField;
public:
bool comp(const vector<string>& a, const vector<string>& b)
{
return a[numField] < b[numField];
}
void getSort(vector<vector<string>>& catalogue, int field)
{
numField = field;
if (numField > (int)catalogue.size() || numField < 0) cout << "Поле №" << numField << " осутствует" << endl;
else sort(catalogue.begin(), catalogue.end(), comp);
}
// Sorter(int);
};
но получил сообщение об ошибке:
Ошибка C3867 "Sorter::comp": нестандартный синтаксис; используйте "&", чтобы создать указатель на член RD_CompAgr G:_Disk_G_Docs_pc_Programming\C++\RD_CompAgr\RD_CompAgr\Sorter.h 25
Хотя то же, но не в классе скомпилировалось без ошибок
Ответы (1 шт):
Здесь Вы не можете передать предикатом функцию-член, потому что функцию-член нужно вызывать на конкретном объекте, чего не происходит в данном случае.
Если функция статическая, то данный код сможет сработать.
В Вашем случае функция comp должна быть статической, и для этого в Вашем случае нужно будет чтобы поле numField также было с спецификатором static.
Соответственно вызов функции sort() будет следующего вида:
sort(catalogue.begin(), catalogue.end(), &Sorter::comp);
Но в этом случае numField будет идентичным во всех экземплярах класса, что может Вам не подойти.
На Вашем месте я бы сделал так:
class Sorter
{
private:
int numField;
public:
void getSort(vector<vector<string>>& catalogue, int field)
{
const auto comp = [&](const vector<string>& a, const vector<string>& b)
{
return a[numField] < b[numField];
};
numField = field;
if (numField > (int)catalogue.size() || numField < 0) cout << "Поле №" << numField << " осутствует" << endl;
else sort(catalogue.begin(), catalogue.end(), comp);
}
// Sorter(int);
};
То есть вместо функции sort(), которая определена в классе, создать лямбу внутри функции и использовать ее.