構建一個使用Boost.Compute庫的程序時出現問題。 我使用兩個zip_iterator
s由兩個浮點迭代器的元組構成,每個浮點迭代器都有 用於將兩個浮點向量與boost::compute::sort()
函數排序。 我的代碼(包括compute::vector
■找了充滿浮點值前):使用zip迭代器調用boost :: compute :: sort()會產生構建錯誤
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
]
謝謝!但有一個問題仍然存在:爲什麼傳遞只讀zip_iterator是一個問題?我不想讓zip_iterators排序,但它們指向的float矢量(通過iteratos構造的元組)。所以在sort()期間,zip_iterators本身的值不應該被改變,它們應該是什麼? – Miray
Boost計算中的[用於zip迭代器的OpenCL代碼生成器當前實現](https://github.com/boostorg/compute/blob/master/include/boost/compute/iterator/zip_iterator.hpp#L107)的方式只是防止工作中的任務,令人遺憾的是。我想知道這是否可以修復,費用是多少。 –