C 范围V3:试图将链条链在一起转换

C++ range-v3: trying to chain together transforms

本文关键字:在一起 转换 范围 V3      更新时间:2023-10-16

我是范围库的新手,所以我对此代码没有编译,我不知道为什么:

#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'。

有人可以看到我在做什么错,或者告诉我如何在可能的情况下正确连接它们?

预先感谢!

如Porsche9ii所指出的," std::ifstream没有复制构造函数"。您可以在此处找到有关此主题的更多信息:

为什么iostreams无法复制?

C 11引入了std::basic_ifstream的移动构造函数(6(,因此您可以写

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');
}

可在此处测试。

std::ifstream没有复制构造函数 - 函数返回 std::ifstream不是一个好主意。一种可能的解决方案:打开和计数应在一个功能中进行。

相关文章: