【发布时间】:2018-12-25 17:06:30
【问题描述】:
我想一起使用boost::compute and boost::range,如下所示,但是如果我取消注释#include <boost/range/combine.hpp> 行,我会收到错误消息,指出boost::compute::zip_iterator 和boost::iterators::zip_iterator 不明确。有没有办法解决这个问题,以便我可以在同一个 cpp 文件中同时使用 boost::compute 和 boost::range?我在 Windows vs2015 64bit 上使用。提升 1.67.0。
更新:我发现如果我尝试包含 boost/iterator/zip_iterator.hpp 而不是 boost/range/combine.hpp,则会发生相同的错误,因此它不是特定于 Boost Range 库。
代码:
#include <vector>
#include <iostream>
#include <algorithm>
//#include <boost/range/combine.hpp>
#include <boost/compute/lambda.hpp>
#include <boost/compute/functional/math.hpp>
#include <boost/compute/container/vector.hpp>
#include <boost/compute/algorithm/transform.hpp>
namespace compute = boost::compute;
using compute::float4_;
using compute::lambda::_1;
using compute::lambda::_2;
using compute::lambda::distance;
int main()
{
// get default device and setup context
compute::device device = compute::system::default_device();
compute::context context(device);
compute::command_queue queue(context, device);
// generate random data on the host
std::vector<float4_> a(10000);
std::vector<float4_> b(10000);
std::vector<float> r(10000);
std::generate((float*)a.data(), (float*)(a.data() + a.size()), rand);
std::generate((float*)b.data(), (float*)(b.data() + b.size()), rand);
// create a vector on the device
compute::vector<float4_> _a(a.size(), context);
compute::vector<float4_> _b(b.size(), context);
compute::vector<float> _r(r.size(), context);
// transfer data from the host to the device
compute::copy(a.begin(), a.end(), _a.begin(), queue);
compute::copy(b.begin(), b.end(), _b.begin(), queue);
boost::compute::transform(
_a.begin(), _a.end(),
_b.begin(),
_r.begin(),
distance(_1, _2),
queue
);
// copy values back to the host
compute::copy(_r.begin(), _r.end(), r.begin(), queue);
for (int i = 0; i < a.size(); ++i)
{
float4_ va = a[i];
float4_ vb = b[i];
float vr = r[i];
float e = std::sqrt(std::pow(va[0] - vb[0], 2) +
std::pow(va[1] - vb[1], 2) +
std::pow(va[2] - vb[2], 2) +
std::pow(va[3] - vb[3], 2));
std::cout << std::setprecision(12);
if (std::abs(e - vr) > 1e-2)
std::cout << e << " != " << vr << "\n";
}
return 0;
}
错误:
1>------ 构建开始:项目:demo,配置:Debug x64 ------ 1> demo.cpp 1> 这个头是实现细节并提供给 向后兼容性。 1>C:\local\boost_1_67_0\boost/compute/algorithm/transform.hpp(67): 错误 C2668: 'boost::compute::make_zip_iterator': 模糊调用 重载函数 1> C:\local\boost_1_67_0\boost/compute/iterator/zip_iterator.hpp(276): 注意:可能是 'boost::compute::zip_iterator,boost::compute::buffer_iterator,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost ::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>> boost::compute::make_zip_iterator,boost::compute::buffer_iterator,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost: :tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>>(IteratorTuple)' 1> 与 1> [ 1>
T=boost::compute::float4_, 1>
IteratorTuple=boost::tuples::tuple,boost::compute::buffer_iterator,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type, boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type> 1>]1> C:\local\boost_1_67_0\boost/iterator/zip_iterator.hpp(357):注意:或
'boost::iterators::zip_iterator,boost::compute::buffer_iterator,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost ::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>> boost::iterators::make_zip_iterator,boost::compute::buffer_iterator,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost: :tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>>(IteratorTuple)' [使用参数相关查找找到] 1> with 1> [ 1> T=boost::compute::float4_, 1>
IteratorTuple=boost::tuples::tuple,boost::compute::buffer_iterator,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type, boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type> 1>]1> C:\local\boost_1_67_0\boost/compute/algorithm/transform.hpp(67):注意: 在尝试匹配参数列表时 '(boost::tuples::tuple,boost::compute::buffer_iterator,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type, boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>)' 1> 与 1> [ 1>
T=boost::compute::float4_ 1> ] 1> C:\workspaces\compute_test\src\demo.cpp(45):注意:见参考 函数模板实例化 'OutputIterator boost::compute::transform,boost::compute::buffer_iterator,boost::compute::buffer_iterator,boost::compute::lambda::expression>(InputIterator1,InputIterator1,InputIterator2,OutputIterator,BinaryOperator,boost::compute ::command_queue &)' 正在编译 1> 和 1> [ 1>
OutputIterator=boost::compute::buffer_iterator, 1>
T=boost::compute::float4_, 1>
expr=boost::proto::exprns_::basic_expr,0>>,const boost::compute::lambda::表达式>,0>> &,常量 boost::compute::lambda::表达式>,0>> &>,3>, 1>
InputIterator1=boost::compute::buffer_iterator, 1>
InputIterator2=boost::compute::buffer_iterator, 1>
BinaryOperator=boost::compute::lambda::expression,0>>,const boost::compute::lambda::表达式>,0>> &,常量 boost::compute::lambda::表达式>,0>> &>,3>> 1> ] 1>C:\local\boost_1_67_0\boost/compute/algorithm/transform.hpp(68): 错误 C2668: 'boost::compute::make_zip_iterator': 模糊调用 重载函数 1> C:\local\boost_1_67_0\boost/compute/iterator/zip_iterator.hpp(276): 注意:可能是 'boost::compute::zip_iterator,boost::compute::buffer_iterator,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost ::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>> boost::compute::make_zip_iterator,boost::compute::buffer_iterator,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost: :tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>>(IteratorTuple)' 1> 与 1> [ 1>
T=boost::compute::float4_, 1>
IteratorTuple=boost::tuples::tuple,boost::compute::buffer_iterator,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type, boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type> 1>]1> C:\local\boost_1_67_0\boost/iterator/zip_iterator.hpp(357):注意:或
'boost::iterators::zip_iterator,boost::compute::buffer_iterator,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost ::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>> boost::iterators::make_zip_iterator,boost::compute::buffer_iterator,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost: :tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>>(IteratorTuple)' [使用参数相关查找找到] 1> with 1> [ 1> T=boost::compute::float4_, 1>
IteratorTuple=boost::tuples::tuple,boost::compute::buffer_iterator,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type, boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type> 1>]1> C:\local\boost_1_67_0\boost/compute/algorithm/transform.hpp(68):注意: 在尝试匹配参数列表时 '(boost::tuples::tuple,boost::compute::buffer_iterator,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type, boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>)' 1> 与 1> [ 1>
T=boost::compute::float4_1>] 1>C:\local\boost_1_67_0\boost/compute/algorithm/transform.hpp(72): 错误 C2672:“转换”:未找到匹配的重载函数 1>C:\local\boost_1_67_0\boost/compute/algorithm/transform.hpp(72): 错误 C2780: 'OutputIterator boost::compute::transform(InputIterator1,InputIterator1,InputIterator2,OutputIterator,BinaryOperator,boost::compute::command_queue &)': 需要 6 个参数 - 提供 4 个 1> C:\local\boost_1_67_0\boost/compute/algorithm/transform.hpp(55):注意: 见'boost::compute::transform'的声明 ========== 构建:0 成功,1 个失败,2 个最新,0 个跳过 ==========
【问题讨论】:
-
如果您认为这是一个错误,您可以在 boost:boost.org/development/bugs.html 上打开一个错误或尝试通过使用邮件列表之一获得帮助:boost.org/community/groups.html(检查它是否是错误或不是)。
-
张贴邮件列表,谢谢。
-
C++ 模板代码中最常见的错误之一。大多数人甚至不知道 C++ 中的参数依赖查找是多么糟糕。
标签: c++ visual-studio-2015 boost-range boost-iterators boost-compute