2016-11-17 49 views
3

構建一個使用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 
] 

回答

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>,並要通過模板的無盡層是給我一個輕度頭痛,但是這是發生了什麼,本質上。

+0

謝謝!但有一個問題仍然存在:爲什麼傳遞只讀zip_iterator是一個問題?我不想讓zip_iterators排序,但它們指向的float矢量(通過iteratos構造的元組)。所以在sort()期間,zip_iterators本身的值不應該被改變,它們應該是什麼? – Miray

+0

Boost計算中的[用於zip迭代器的OpenCL代碼生成器當前實現](https://github.com/boostorg/compute/blob/master/include/boost/compute/iterator/zip_iterator.hpp#L107)的方式只是防止工作中的任務,令人遺憾的是。我想知道這是否可以修復,費用是多少。 –