构建使用Boost.Compute库的程序时遇到问题。
我使用两个zip_iterator
,每个由两个浮点迭代器的元组组成
使用boost::compute::sort()
函数对两个浮点向量进行排序。
我的代码(两个compute::vector
之前都填充了浮点值):
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
]
答案 0 :(得分: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>
,并且通过无尽的模板层层给我一个轻微的头痛,但这就是正在发生的事情。