Как можно избежать конфликтов boost::compute::zip_iterator и boost::iterators::zip_iterator при совместном использовании boost compute и boost::range?

Я хотел бы использовать boost::compute and boost::range вместе, как показано ниже, но если я раскомментирую #include <boost/range/combine.hpp> линия я получаю сообщение о том, что boost::compute::zip_iterator а также boost::iterators::zip_iterator неоднозначны. Есть ли способ обойти это, чтобы я мог использовать boost::compute а также boost::range вместе в одном файле cpp? Я использую на 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, Конфигурация: Отладка x64 ------ 1> demo.cpp 1> Этот заголовок является подробностью реализации и предназначен для обратной совместимости. 1>C:\local\boost_1_67_0\boost/compute/gorithm/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:: вычислить::make_zip_iterator, повышение:::: buffer_iterator вычислений, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>>(IteratorTuple)' 1> с 1> [1>
T = boost:: compute:: float4_, 1>
IteratorTuple = повышение:: кортежи:: кортеж, повышение:::: buffer_iterator вычислений, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи::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): примечание: или
"Подталкивание:: итераторы:: zip_iterator, повышение:::: buffer_iterator вычислений, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, подталкивание::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:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи::null_type,boost::tuples::null_type>>(IteratorTuple)' [найдено с использованием поиска, зависящего от аргумента] 1> с 1> [1> T = boost:: compute:: float4_, 1>
IteratorTuple = повышение:: кортежи:: кортеж, повышение:::: buffer_iterator вычислений, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи::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/ алгоритма / transform.hpp (67): примечание: при попытке сопоставить список аргументов '(boost::tuples::tuple,boost::compute::buffer_iterator,boost::tuples::null_type,boost::tuples::null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи::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:: expression>,0 >> &, const boost:: compute:: lambda:: expression>,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:: expression>,0 >> &, const boost:: compute:: lambda:: expression>,0> > &>, 3 >> 1>] 1> C: \ local \ boost_1_67_0 \ boost / compute /gorithm/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, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, подталкивание::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 = повышение:: кортежи:: кортеж, повышение:::: buffer_iterator вычислений, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи::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): примечание: или
"Подталкивание:: итераторы:: zip_iterator, повышение:::: buffer_iterator вычислений, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, подталкивание::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:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи::null_type,boost::tuples::null_type>>(IteratorTuple)' [найдено с использованием поиска, зависящего от аргумента] 1> с 1> [1> T = boost:: compute:: float4_, 1>
IteratorTuple = повышение:: кортежи:: кортеж, повышение:::: buffer_iterator вычислений, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи::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/ алгоритма / transform.hpp (68): примечание: при попытке сопоставить список аргументов '(boost::tuples::tuple,boost::compute::buffer_iterator,boost::tuples::null_type,boost::tuples::null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи:: null_type, повышение:: кортежи::null_type>)" 1> с 1> [1>
T = boost:: compute:: float4_ 1>] 1> C: \ local \ boost_1_67_0 \ boost / compute /gorithm/transform.hpp(72): ошибка C2672: 'transform': не найдена соответствующая перегруженная функция 1> C: \ local \ boost_1_67_0 \ boost / compute /gorithm/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 /gorithm/transform.hpp(55): примечание: см. объявление'boost::compute::transform' ========== Построить: 0 успешно выполнено,

1 не удалось, 2 обновлено,0 пропущено ==========

1 ответ

Решение

Краткосрочное исправление заключается в изменении boost/compute/algorithm/transform.hpp, Измените оба звонка на make_zip_iterator в ::boost::compute::make_zip_iterator, Это квалифицирует вызов, чтобы избежать зависимого от аргумента поиска.

Обновление: это исправлено в #790

Другие вопросы по тегам