Я изучаю библиотеку range-v3 и у меня проблема с компиляцией следующего кода:
#include <range/v3/all.hpp>
#include <iostream>
#include <vector>
using namespace ranges;
using std::vector;
using std::pair;
// does not use ranges in my actual code
vector<float> render(unsigned width, unsigned i) {
std::mt19937 gen(i);
std::uniform_real_distribution<float> dis(0.f, 1.f);
return to_vector(view::generate_n(
[&gen, &dis](){ return dis(gen); },
width));
}
int main()
{
unsigned n = 2;
unsigned width = 3;
auto sq = [](auto v) { return v * v; };
auto addPairs = [](auto a, auto b) {
return std::make_pair(a.first + b.first, a.second + b.second);
};
auto addPairVectors = [addPairs](auto rA, auto rB) {
return view::zip_with(addPairs, rA, rB);
};
auto valueError = [sq](float i, float ref) {
return std::make_pair(i, sq(i - ref));
};
vector<float> reference(width, 0.5f);
auto renderData =
view::iota(0u, n)
/*line 39*/ | view::transform([width](auto i) { return render(width, i); })
| view::join;
auto referenceRepeated =
view::repeat(reference)
| view::join;
auto renderDataWithError =
/*line 47*/ view::zip_with(valueError, renderData, referenceRepeated)
| view::chunk(width);
auto nTimesResultAndError = accumulate(renderDataWithError,
vector<pair<float, float>>(width),
addPairVectors);
float nInv = 1.f/n;
auto result = to_vector(
nTimesResultAndError
| view::transform([nInv](auto v) { return v.first * nInv;}) );
auto stdDev = to_vector(
nTimesResultAndError
| view::transform([nInv](auto v) {
return std::sqrt(v.second * nInv);
}));
return 0;
}
г++ говорит:
../rangesTest/main.cpp:47:69: required from here
../rangesTest/include/range/v3/view/all.hpp:78:35:
error: static assertion failed: Cannot get a view of a temporary container
Я пробовал g++7 и 8 и clang 6. Все говорят что-то похожее. Насколько я понимаю, проблема в строке 39, где я возвращаю временный файл.
Моя цель здесь состоит в том, чтобы вычислить рендеринг только по одному за раз и добавить их один за другим к сумме. По-видимому, это не работает с кодом выше. Можно ли вообще сформулировать это с помощью библиотеки диапазонов и как?
store()
- person Barry   schedule 17.12.2018