Мой вопрос во многом похож на этот: Передать пользовательский компаратор через функцию, но я попробовал решение, предложенное там, и не смог заставить его работать.
В двух словах, у меня есть метод, который сохраняет несколько отсортированных структур и выполняет несколько сравнений, всегда с элементами типа int
, все используют один и тот же порядок. Порядок определяется при вызове метода.
намеренный звонок будет выглядеть примерно так: myFunction(std::greater<int>());
Сначала я попытался объявить функцию как: void myFunction(binary_operator<int, int, bool> order);
но согласно это объяснение, binary_function
не подходит для использования в качестве базового класса в вызовах функций.
В заключение, Я старался предложение от этот ответ (и многие другие сайты), на которых предлагалось используя шаблоны. Но я до сих пор не могу заставить мой код скомпилироваться.
Минимальный нерабочий пример:
template <typename Comparator>
void myFunction(Comparator order){
if (order(1,2)){
// some stuff
// COMPILES OK
}
std::vector <int> vecToSort;
// ... initialize
std::sort(vecToSort.begin(), vecToSort.end(), order); // works
// COMPILES OK
std::multimap <int, int, order > boundary;
// STARTS KICKING, SCREAMING AND SHOUTHING
}
и ошибка компиляции я получаю:
ошибка: несоответствие типа / значения в аргументе 3 в списке параметров шаблона для «шаблона класса std :: multimap»
ошибка: ожидал тип, получил «заказ»
Я полагал, что та же самая уловка должна работать для обоих. Это не. (редактировать: я вижу type
/object
проблема сейчас)
Может кто-нибудь объяснить, пожалуйста, что здесь происходит и как получить multimap
использовать порядок, переданный в качестве аргумента функции?
PS: я не использую boost для этого проекта.
Это должно быть объявлено следующим образом:
std::multimap <int, int, Comparator> boundary(order);
^^^^^^^^^^
Как говорится в комментариях, вы должны предоставить type
не object
, Эти документы для Построить мультикарту приведу несколько примеров.
использование Comparator
а также order
в этой форме:
std::multimap <int, int, Comparator> boundary (order);
Сначала передайте тип сравнения внутри <>
а затем передать объект сравнения в конструктор.