Привильный синтаксис для вызова 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 шт):

Автор решения: Lex Marchenko

Здесь Вы не можете передать предикатом функцию-член, потому что функцию-член нужно вызывать на конкретном объекте, чего не происходит в данном случае.
Если функция статическая, то данный код сможет сработать.
В Вашем случае функция 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(), которая определена в классе, создать лямбу внутри функции и использовать ее.

→ Ссылка