VS2019上的array <double *>到vector <double>范围v3样式

问题描述

我想将array<double*>转换为vector<double>,以便可以对两个相同类型的向量进行ranges::views::concat,但是我很难做到这一点。

我有以下代码

#include <range/v3/all.hpp>

#include <array>

static constexpr auto max_elements = 2000;

struct PriceInfo
{
    std::array<double*,max_elements> prices;
};

auto main() -> int
{
    const PriceInfo* const buf_prices = nullptr;
    const auto vec = buf_prices->prices 
                   | ranges::views::indirect 
                   | ranges::to_vector;
}

我在编译时遇到以下错误,并且我不明白为什么我相信我的代码是正确的,至少它在gcc下编译时没有错误

错误(活动)E0349没有操作符“ |”匹配这些操作数

enter image description here

请问如何解决错误

解决方法

首先,您的代码包含UB,因为您从未创建PriceInfo。 其次,该错误可能意味着不正确的项目配置,是否已设置标准?编译器是否与库要求完全兼容?如果是这样的话,这是否是库的正确分支(例如,针对MSVC编译器有单独的分支)。 第三,假定将解决这些问题,除非价格的所有元素都不为nullptr,否则该代码将发生段错误。

这样工作:

#include <range/v3/all.hpp>
#include <iostream>
#include <array>

static constexpr auto max_elements = 3; //  will segfault if there are null pointers

struct PriceInfo
{
    std::array<double*,max_elements> prices;
};

auto main() -> int
{
    auto a = std::array<double,3>{1.0,2.0,3.0};
    const PriceInfo* const buf = new PriceInfo{&a[0],&a[1],&a[2]};
    
    const auto vec = buf->prices 
                   | ranges::views::indirect 
                   | ranges::to_vector;
                   
    for( auto a : vec)
        std::cout << a << "\n";
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...