2013-05-02 3 views
-1

Мой вопрос во многом похож на этот: Pass a custom comparator through a function, но я попробовал предлагаемое там решение и не смог заставить его работать.Пользовательский компаратор (заказ) в качестве параметра (порядка отображения) карты?

В двух словах, у меня есть метод, который держит несколько отсортированных структуры и выполняет несколько сравнений, всегда на элементах типа int, все с использованием того же заказом. Порядок составляет , определяемый при вызове метода.

ПРЕДНАЗНАЧЕН вызов будет выглядеть примерно так: myFunction(std::greater<int>());

Во-первых, я попытался объявить функцию: void myFunction(binary_operator<int, int, bool> order); но, согласно this explanation, binary_function не подходит в качестве базового класса в вызовах функций.

Наконец, я попытался предложение от this answer (и во многих других местах), которая предложила с использованием шаблонов. Но я все еще не могу скомпилировать свой код.

Минимальный нерабочим пример:

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 
} 

и ошибка компиляции я получаю:

error: type/value mismatch at argument 3 in template parameter list for ‘template class std::multimap’ error: expected a type, got ‘order’

я понял, тот же трюк должен работать для обоих. Это не. (Редактирование: Я вижу проблему type/object сейчас)

Может кто-нибудь объяснить, что происходит здесь и как получитьmultimapиспользовать порядок, переданный в качестве аргумента функции?

PS: Я не использую boost для этого проекта.

+0

ошибка очень ясная, заказ - это не тип, поэтому не может быть передан в параметр шаблона. – yngccc

+0

'std :: multimap' требует ** типа ** в качестве параметра шаблона, и вы используете объект. – juanchopanza

+0

хорошо, я вижу проблему типа/объекта. Но это просто ответит * почему * Я получаю ошибку, а не как использовать мой желаемый порядок (переданный как параметр функции), чтобы упорядочить мои структуры, в том числе «multimap». – penelope

ответ

2

Он должен быть объявлен следующим образом:

std::multimap <int, int, Comparator> boundary(order); 
         ^^^^^^^^^^ 

Как говорят комментарии, вы должны обеспечить type не object. В этих документах для Construct multimap приведены некоторые примеры.

+0

хорошо, я вижу проблему с типом/объектом.Но, как это, какой точный порядок будет иметь элементы в «multimap»? Как добиться того, чтобы они были упорядочены тем, что передано в качестве функционального параметра в вызове функции? – penelope

+0

@penelope Извинения за опечатку, я только что исправил ее. –

+1

@penelope Просто создав экземпляр, как показано выше, передав 'order' в качестве параметра конструктора. См. [Здесь] (http://en.cppreference.com/w/cpp/container/map/map). – juanchopanza

2

Использование Comparator и order в этой форме:

std::multimap <int, int, Comparator> boundary (order); 

Первый проход Сравнения типа внутри <>, а затем передать объект в сравнение конструктора.

Смежные вопросы