C++ 使用zip迭代器调用boost::compute::sort()会传递生成错误

C++ 使用zip迭代器调用boost::compute::sort()会传递生成错误,c++,boost,boost-compute,C++,Boost,Boost Compute,我在构建一个使用Boost.Compute库的程序时遇到了一个问题。 我使用两个zip_迭代器s,每个迭代器由两个浮点迭代器组成的元组组成 使用boost::compute::sort()函数对两个浮点向量进行排序。 我的代码(之前都用浮点值填充了compute::vectors): 错误消息的后半部分更改为: could be **'boost::compute::zip_iterator<Sort_Tuple>' or 'boost::compute::buffer_

我在构建一个使用Boost.Compute库的程序时遇到了一个问题。 我使用两个
zip_迭代器
s,每个迭代器由两个浮点迭代器组成的元组组成 使用
boost::compute::sort()
函数对两个浮点向量进行排序。 我的代码(之前都用浮点值填充了
compute::vector
s):

错误消息的后半部分更改为:

could be **'boost::compute::zip_iterator<Sort_Tuple>'
or       'boost::compute::buffer_iterator<T>'**
with
[
     T=value_type
]
可以是**'boost::compute::zip\u迭代器'
或“boost::compute::buffer\u迭代器”**
具有
[
T=值\类型
]

即使编译了代码,也无法对zip迭代器进行排序:它们是只读的。您必须对元组向量进行排序

关于
迭代器
的模糊性,编译器并不是指您正在传递的类型,而是指调用链中更深层的某个函数的
迭代器

template<class Iterator, class Compare>
inline void dispatch_merge_blocks(Iterator first, Iterator result, /* ... /);
这里,
first
是您传入的
迭代器,类型为:

zip_iterator<tuple<buffer_iterator<float>, buffer_iterator<float>>>
向量:迭代器(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, /* ... */);
}
模板
内联void merge_块(迭代器优先,迭代器结果,/*…*/)
{
//虚拟迭代器,因为它不是按键排序的
迭代器伪码;
合并_块(第一个,虚拟,结果,虚拟,/*…*/);
}
注意这行:
迭代器伪。它无法编译,因为
zip\u迭代器
没有默认构造函数,所以模板实例化失败,整个过程无法编译


(1):我不完全确定
value\u type
如何最终被推断为
元组
,经历层出不穷的模板让我有点头疼,但本质上就是这样。

谢谢!但有一个问题仍然存在:为什么传递只读zip_迭代器会是一个问题?我不想对zip_迭代器进行排序,而是希望得到它们所指向的浮点向量(通过迭代器构造的元组)。因此,在sort()期间不应更改zip_迭代器本身的值,对吗?遗憾的是,Boost计算中的方式只是阻止赋值工作。我想知道这是否可以修复,成本是多少。
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, /* ... */);
zip_iterator<tuple<buffer_iterator<float>, buffer_iterator<float>>>
typedef typename std::iterator_traits<Iterator>::value_type value_type;

// temporary buffer for merge result
vector<value_type> temp(count, context);
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, /* ... */);
}