Вызов boost :: compute :: sort () с итераторами zip доставляет ошибки сборки

У меня проблема с созданием программы, которая использует библиотеку Boost.Compute.
Я использую два zip_iterators состоит из кортежа из двух итераторов с плавающей точкой каждый
отсортировать два float-вектора с boost::compute::sort() функция.
Мой код (оба compute::vectors были заполнены значениями с плавающей точкой ранее):

typedef compute::vector<float>::iterator Float_Iterator;
typedef boost::tuple<Float_Iterator, Float_Iterator> Sort_Tuple;
typedef compute::zip_iterator<Sort_Tuple> Sort_Iterator;

Sort_Iterator first_sort = compute::make_zip_iterator
(boost::make_tuple(d_x.begin(), d_y.begin()));
Sort_Iterator last_sort = compute::make_zip_iterator
(boost::make_tuple(d_x.end(), d_y.end()));

BOOST_COMPUTE_FUNCTION(bool, compare, (const boost::tuple<float, float> p1, const boost::tuple<float, float> p2),
{
return boost_tuple_get(p1, 0) < boost_tuple_get(p2, 0);
}
);

compute::sort(first_sort, last_sort, compare, queue);

При компиляции я получаю:

error C2782: 'void   boost::compute::detail::dispatch_merge_blocks(Iterator,Iterator,Compare,size_t,c onst size_t,const size_t,const size_t,boost::compute::command_queue &)' :   **template parameter 'Iterator' is ambiguous**
c:\local\boost_1_62_0\boost\compute\algorithm\detail\merge_sort_on_cpu.hpp(129)     : see declaration of 'boost::compute::detail::dispatch_merge_blocks'
could be **'Sort_Iterator'
or       'boost::compute::buffer_iterator<T>'**
with
[
T=value_type
]

Как вы можете видеть в моем коде, я вызываю функцию с двумя Sort_IteratorЯ объявил ранее. Оба аргумента имеют один и тот же тип, так почему компилятор должен предполагать двусмысленность? Я не понимаю этого.

Тем не менее, если я пытаюсь явно набрать приведение аргументов функции, как

compute::sort((Sort_Iterator)first_sort, (Sort_Iterator)last_sort, compare,    queue);

последняя часть сообщения об ошибке меняется на:

could be **'boost::compute::zip_iterator<Sort_Tuple>'
or       'boost::compute::buffer_iterator<T>'**
with
[
T=value_type
]

3

Решение

Даже если ваш код скомпилирован, вы не сможете сортировать zip-итераторы: они доступны только для чтения. Вместо этого вы должны отсортировать вектор кортежей.

Учитывая Iterator неоднозначность, компилятор не ссылается на типы вы проходят, но к Iterator некоторые функции гораздо глубже в цепочке вызовов:

template<class Iterator, class Compare>
inline void dispatch_merge_blocks(Iterator first, Iterator result, /* ... /);

Это называется так:

dispatch_merge_blocks(first, temp.begin(), /* ... */);
dispatch_merge_blocks(temp.begin(), first, /* ... */);

Вот, first это Iterator вы прошли, типа:

zip_iterator<tuple<buffer_iterator<float>, buffer_iterator<float>>>

А также temp.begin() является…

typedef typename std::iterator_traits<Iterator>::value_type value_type;

// temporary buffer for merge result
vector<value_type> temp(count, context);

vector<tuple<float, float>>::iterator(1). Компилятор видит два разных типа для одного и того же параметра шаблона, и, следовательно, вывод не выполняется.

Кроме того, далее в цепочке вызовов появляется следующая функция:

template<class Iterator, class Compare>
inline void merge_blocks(Iterator first, Iterator result, /* ... */)
{
// dummy iterator as it's not sort by key
Iterator dummy;
merge_blocks(first, dummy, result, dummy, /* ... */);
}

Обратите внимание на строку: Iterator dummy;, Это не компилируется, потому что zip_iterator не имеет конструктора по умолчанию, поэтому создание экземпляра шаблона завершается неудачно и все компилируется.

(1): Я не совсем уверен, как value_type в конечном итоге выводится как tuple<float, float>И прохождение через бесконечные слои шаблонов вызывает у меня легкую головную боль, но это то, что происходит, по сути.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]