Пользовательские функторы сравнения C ++ - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь передать пользовательский функтор в std :: map.

Итак, я объявляю следующий функтор и класс, членом которого является карта в файле HEADER.

class Comp {
        bool g;
        public:
                Comp(bool greater) : g(greater) {}
                bool operator()(float lhs, float rhs) const {
                        if (g) return lhs >= rhs;
                        return lhs < rhs;
                }
};

class OrderBook {
        u_char OrderBookType;
        std::map<float, std::vector<float*>, Comp> OrderBookData;

        public:
                OrderBook(u_char);
                float best_bid_ask(int);
};

И в файле. cpp я определяю конструктор для класса OrderBook следующим образом для инициализации std :: map.

OrderBook::OrderBook(u_char bookType)  {
        OrderBookType = bookType;
        OrderBookData(Comp(bookType == 'B'));
}

Однако, когда я пытаюсь скомпилировать программу, я сталкиваюсь с ошибка типа «тип не предоставляет оператора вызова»:

error: type 'std::map<float, std::vector<float *>, Comp>' does not provide a call operator
        OrderBookData(Comp(bookType == 'B'));

Я очень не понимаю, почему я столкнулся с этой ошибкой.

Любая помощь приветствуется.

1 Ответ

2 голосов
/ 12 июля 2020

Вам необходимо использовать синтаксис списка инициализаторов для создания элементов:

OrderBook::OrderBook(u_char bookType) :
    OrderBookType{bookType},
    OrderBookData{Comp{bookType == 'B'}} { }

В точке, где вы пытаетесь построить карту, она уже построена по умолчанию. Синтаксис, который вы используете, выглядит как вызов функции, поэтому компилятор ищет подходящую operator() функцию на карте, но не находит ее - отсюда и ошибка.

...