[英]Call of boost::compute::sort() with zip iterators delivers build errors
我在構建一個使用Boost.Compute庫的程序時遇到了問題。 我使用兩個zip_iterator
由兩個float迭代器組成,每個浮點迭代zip_iterator
boost::compute::sort()
函數對兩個float-vector進行boost::compute::sort()
。 我的代碼( compute::vector
s之前都填充了浮點值):
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
歧義,編譯器不是指你傳遞的類型,而是指代調用鏈中更深層次函數的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>
,並且通過無休止的模板層給我一個輕微的頭痛,但這正是發生的事情,本質上。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.