Передать оператор = функциональному объекту - PullRequest
1 голос
/ 12 июня 2019

Я пытаюсь передать связывание оператора () с функциональным объектом. Затем я хотел бы использовать этот функциональный объект в качестве пользовательского компаратора в карте, которую я объявляю. Но я получаю следующую ошибку компиляции

ошибка C3867: 'Comparator :: operator ()': нестандартный синтаксис; используйте '&' создать указатель на член 1> ошибка C2672: 'std :: bind': не найдена соответствующая перегруженная функция

ошибка C2923: «std :: map»: «предикат» недопустимый тип шаблона аргумент для параметра '_Pr'

Я не хочу использовать выражения lamda

Код, который я написал, следующий:

#include "pch.h"
#include <algorithm>
#include <functional>
#include <iostream>
#include <map>
struct Comparator : std::binary_function<int const &, int const &, bool>
{
    template<typename T>
    bool operator()(T const & a, T const & b)
    {
        return a < b;
    }
};
int main()
{

    std::cout << "Hello World!\n"; 
    std::function<bool(Comparator&,int const &, int const &)> predict = 
    std::bind(Comparator::operator(), std::placeholders::_1, 
     std::placeholders::_2);
    std::map<int, int, predict> x;

}

Ответы [ 2 ]

2 голосов
/ 12 июня 2019

Вам не нужно использовать std::bind или лямбду здесь.Comparator является совершенно корректным компаратором, поэтому вы можете просто объявить x как:

std::map<int, int, Comparator> x;

Если ваш фактический Comparator имеет какое-то состояние, которое вам нужно инициализировать, вы можете передать ComparatorОбъект к конструктору std::map:

Comparator cmp{some, constructor, args};
std::map<int, int, Comparator> x{cmp};
2 голосов
/ 12 июня 2019

После связывания вы получаете функтор, который принимает 2 параметра (int, int), подпись функции std::function<bool(Comparator&,int const &, int const &)> неверна - Comparator избыточна, попробуйте это:

    std::function<bool(int const &, int const &)> predict = 
       std::bind( Comparator(), std::placeholders::_1, std::placeholders::_2);

     std::map<int, int, decltype(predict)> x{predict};
...