C++ xtensor-Tensor包装器在运行时引发轻微的赋值器错误

C++ xtensor-Tensor包装器在运行时引发轻微的赋值器错误,c++,c++14,xtensor,C++,C++14,Xtensor,我目前正在将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 <typ

我目前正在将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

这意味着什么?我能做些什么来解决这个问题?

这就是我为复杂的模板参数提供包装所做的:

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);
}
模板
类位数组{
公众:
位数组(常量xt::xexpression&_数组,浮点字母):
b(xt::cast(_array.derived_cast())、alpha(_alpha)
{
}
decltype(xt::cast(std::declval())b;
浮动α;
};
模板
自动生成_位数组(const-xt::xexpression&expr,float-alpha)
{
返回位数组(expr,alpha);
}

添加一个左值,因为我检查到唯一缺少的是一个ref,您需要
derived\u cast
才能使用
value\u type
,然后需要将其包装在
xexpression
中以确保可以对其进行评估,然后
decltype
ing这将为您提供答案。

这就是我为复杂的模板参数提供包装所做的:

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);
}
模板
类位数组{
公众:
位数组(常量xt::xexpression&_数组,浮点字母):
b(xt::cast(_array.derived_cast())、alpha(_alpha)
{
}
decltype(xt::cast(std::declval())b;
浮动α;
};
模板
自动生成_位数组(const-xt::xexpression&expr,float-alpha)
{
返回位数组(expr,alpha);
}

添加一个左值,因为我检查到唯一缺少的是一个ref,您需要
derived\u cast
才能使用
value\u type
,然后需要将其包装在
xexpression
中以确保可以对其进行评估,而
decltype
这将为您提供答案。

更好的解决方案是在
make\u 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);
}
模板
类位数组{
公众:
位数组(T&&U数组,浮点α):
b(std::move(_数组)),alpha(_alpha)
{
}
T&b;
浮动α;
};
模板
自动生成_位数组(const-xt::xexpression&expr,float-alpha)
{
自动转换=xt::转换(expr);
//需要暂时搬过来吗
返回位数组(std::move(expr),alpha);
}

更好的解决方案是在
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);
}
模板
类位数组{
公众:
位数组(T&&U数组,浮点α):
b(std::move(_数组)),alpha(_alpha)
{
}
T&b;
浮动α;
};
模板
自动生成_位数组(const-xt::xexpression&expr,float-alpha)
{
自动转换=xt::转换(expr);
//需要暂时搬过来吗
返回位数组(std::move(expr),alpha);
}