C++ range-v3:尝试将转换链接在一起
C++ range-v3: trying to chain together transforms
我是 range 库的新手,所以我不应该对这段代码没有编译感到惊讶,我也不知道为什么:
#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
,编译器告诉我 "error: variable has incomplete type 'void'."
谁能看出我做错了什么,或者告诉我如何正确地将它们链接在一起?
提前致谢!
std::ifstream
没有复制构造函数 - 通过函数返回 std::ifstream
不是一个好主意。一种可能的解决方案:打开和计数应该在一个函数中进行。
正如 Porsche9II 所述,“std::ifstream
没有复制构造函数”。您可以在此处找到有关此主题的更多信息:
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');
}
可测试HERE。
我是 range 库的新手,所以我不应该对这段代码没有编译感到惊讶,我也不知道为什么:
#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
,编译器告诉我 "error: variable has incomplete type 'void'."
谁能看出我做错了什么,或者告诉我如何正确地将它们链接在一起?
提前致谢!
std::ifstream
没有复制构造函数 - 通过函数返回 std::ifstream
不是一个好主意。一种可能的解决方案:打开和计数应该在一个函数中进行。
正如 Porsche9II 所述,“std::ifstream
没有复制构造函数”。您可以在此处找到有关此主题的更多信息:
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');
}
可测试HERE。