微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

xt::xexpression 在此上下文中受到保护

如何解决xt::xexpression 在此上下文中受到保护

考虑以下代码

#include <chrono>                                                                                        
#include <iostream>

#include "xtensor/xadapt.hpp"
#include "xtensor/xarray.hpp"
#include "xtensor/xindex_view.hpp"
#include "xtensor/xio.hpp"
#include "xtensor/xview.hpp"

using namespace std;
using namespace std::chrono;

int main() {
    high_resolution_clock::time_point t1 = high_resolution_clock::Now();

    for (int i = 0; i < 1000; i++) {
        xt::expression<float> a = xt::zeros<float>({3,256,256});
    }
    high_resolution_clock::time_point t2 = high_resolution_clock::Now();
    duration<double> time = duration_cast<duration<double>>(t2 - t1);
    cout << time.count() << endl;
}

编译失败,错误如下:test.cpp:24:66: error: ‘xt::xexpression<D>::~xexpression() [with D = float]’ is protected within this context。 将 xt::xexpression<float> (the correct return type) 更改为 auto 时,它会编译并运行。如果 xt::expression 受到保护,为什么 auto 可以访问它?有没有一种方法可以指定类型而不是使用 auto,而不评估 xexpression? (即我不能让 a 的类型为 xt::xarray,因为这会强制求值)。

解决方法

正如凯文在评论中指出的那样,

Auto 不是解析为 xexpression,而是 xexpression 的子代。将类型更改为 xt::xbroadcast<xt::xscalar<float>,std::array<long unsigned int,3> > 将在不求值的情况下进行编译。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。