问题描述
我想将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没有操作符“ |”匹配这些操作数
解决方法
首先,您的代码包含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";
}