C ++ range-v3: попытка связать воедино преобразования - PullRequest
2 голосов
/ 24 мая 2019

Я совершенно новичок в библиотеке диапазонов, поэтому меня не должно удивлять то, что этот код не компилируется, и я не могу понять, почему:

#include <iostream>
#include <algorithm>
#include <fstream>
#include <iterator>
#include <vector>

#include <range/v3/all.hpp>
#include <range/v3/view/all.hpp>
using namespace ranges::v3;


std::ifstream open_file(const std::string &filename) {
    return std::ifstream{filename};
}

int count_lines(std::ifstream &in) {
    return std::count(std::istreambuf_iterator<char>{in},
                      std::istreambuf_iterator<char>{}, '\n');
}

std::vector<int>
count_lines_in_files(const std::vector<std::string> &filenames) {
    auto a1 = filenames | view::transform(open_file) | view::transform(count_lines);
    return a1;
}

int main() {
    const std::vector<std::string> files{"listing1_1.cpp",
                                         "listing1_2.cpp",
                                         "listing1_4.cpp",
                                         "listing1_5.cpp"};
    const auto result = count_lines_in_files(files);
    std::cout << ranges::view::all(result) << '\n';
}

Похоже, что жалоба касаетсяa1, что мне говорит компилятор «ошибка: переменная имеет неполный тип« void ».»

Может кто-нибудь увидеть, что я делаю неправильно, или подсказать, как правильно связать их вместе, если это возможно?

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 24 мая 2019

Как отмечает Porsche9II , "std::ifstream не имеет конструктора копирования".Вы можете найти больше по этой теме здесь:

Почему iostreams не копируются?

C ++ 11 представил конструктор перемещения ( 6 )для std::basic_ifstream, чтобы вы могли написать

auto open_file(const std::string &filename) {
    return std::ifstream{filename};
}

auto count_lines(std::ifstream &&in) {
    return std::count(std::istreambuf_iterator<char>{in},
                      std::istreambuf_iterator<char>{}, '\n');
}

Тестируемый ЗДЕСЬ .

2 голосов
/ 24 мая 2019

std::ifstream не имеет конструктора копирования - возвращать std::ifstream с помощью функции не очень хорошая идея.Одно из возможных решений: открытие и подсчет должны выполняться в одной функции.

...