xtensor — Оболочка Tensor вызывает ошибку trivial_assigner во время выполнения

В настоящее время я использую xtensor для приложения, и я хотел обернуть тензор, чтобы сделать класс под названием BitArray,

#include <iostream>
#include "xtensor/xarray.hpp"#include "xtensor/xio.hpp"#include "xtensor/xview.hpp"#include "xtensor/xindex_view.hpp"
xt::xarray<double> arr {1, 2, 3};

template <typename E>
class BitArray{
public:
BitArray(const xt::xexpression<E>& _array, float _alpha) :
b(xt::cast<std::int8_t>(_array.derived_cast())), alpha(_alpha) {}
xt::xarray<E> b;
float alpha;
};

template <class E>
auto make_bitarray(xt::xexpression<E>& expr, float alpha)
{
return BitArray<E>(expr, alpha);
}

auto a = make_bitarray(arr, 3); // Error

Я получаю сообщение об ошибке ниже:

Standard Exception: Precondition violation!
Internal error: trivial_assigner called with unrelated types.
/srv/conda/include/xtensor/xassign.hpp(505)

Что это значит и что я могу сделать, чтобы решить эту проблему?

0

Решение

Немного лучшим решением было бы создать бросок внутри вашего make_bitarray функция:

template <typename T>
class BitArray{
public:
BitArray(T&& _array, float _alpha) :
b(std::move(_array)), alpha(_alpha)
{
}

T&& b;
float alpha;
};

template <class T>
auto make_bitarray(const xt::xexpression<T>& expr, float alpha)
{
auto cast = xt::cast<int8>(expr);
// need to move temporary here
return BitArray<decltype(cast)>(std::move(expr), alpha);
}
2

Другие решения

Вот что я сделал, чтобы предоставить оболочку для сложных аргументов шаблона:

template <typename T>
class BitArray{
public:
BitArray(const xt::xexpression<T>& _array, float _alpha) :
b(xt::cast<int8>(_array.derived_cast())), alpha(_alpha)
{
}

decltype(xt::cast<int8>(std::declval<std::add_lvalue_reference_t<T>>())) b;
float alpha;
};

template <class T>
auto make_bitarray(const xt::xexpression<T>& expr, float alpha)
{
return BitArray<T>(expr, alpha);
}

Добавьте lvalue, потому что я проверил, что единственное, что пропало, это ссылка, и вам нужно derived_cast чтобы иметь value_type, а затем вам нужно обернуть это внутри xexpression чтобы убедиться, что это может быть оценено, и decltypeЭто дает вам ответ.

0

По вопросам рекламы [email protected]