range-v3头文件引入顺序错误导致编译失败问题求助
range-v3 v0.12.0中set_intersection与transform头文件引入顺序导致编译失败的解决方案
问题现象
在使用range-v3 v0.12.0的views::set_intersection和views::transform时,头文件引入顺序会影响编译结果:
- 先引入
<range/v3/view/set_algorithm.hpp>再引入<range/v3/view/transform.hpp>,使用管道语法m1 | ranges::views::set_intersection(m2)会触发编译错误,提示use of undeclared identifier 'bind_back' - 调换两个头文件的引入顺序,代码可正常编译
问题原因
这是range-v3 v0.12.0版本的头文件依赖bug。虽然set_algorithm.hpp已经包含了bind_back的定义文件meta/meta.hpp,但管道语法所需的视图闭包功能依赖于transform.hpp引入的基础视图基础设施——这些组件会确保bind_back在合适的上下文环境中可见。当先引入set_algorithm.hpp时,相关依赖组件未完成初始化,导致编译器无法识别bind_back。
解决方案
方案1:调整头文件引入顺序
将<range/v3/view/transform.hpp>放在<range/v3/view/set_algorithm.hpp>之前引入:
#include <iostream> #include <map> #include <range/v3/view/transform.hpp> #include <range/v3/view/set_algorithm.hpp> int main () { std::map<int, int> m1 {{0, 0}, {1, 1}, {2, 2}}; std::map<int, int> m2 {{0, 0}, {2, 1}, {3, 2}}; { std::cout << "set_intersection\n"; auto res = ranges::views::set_intersection(m1, m2); for(auto&& p : res) { std::cout << p.first << ' ' << p.second << '\n'; } } { std::cout << "set_intersection\n"; auto res = m1 | ranges::views::set_intersection(m2); for(auto&& p : res) { std::cout << p.first << ' ' << p.second << '\n'; } } { std::cout << "set_intersection and pipe\n"; auto res = ranges::views::set_intersection(m1, m2) | ranges::views::transform( [](auto&& p) { return 0; }); } return 0; }
方案2:引入统一头文件
直接引入range-v3的全局头文件<range/v3/all.hpp>,它会自动处理所有头文件的依赖关系,无需关心引入顺序:
#include <iostream> #include <map> #include <range/v3/all.hpp> int main () { std::map<int, int> m1 {{0, 0}, {1, 1}, {2, 2}}; std::map<int, int> m2 {{0, 0}, {2, 1}, {3, 2}}; { std::cout << "set_intersection\n"; auto res = ranges::views::set_intersection(m1, m2); for(auto&& p : res) { std::cout << p.first << ' ' << p.second << '\n'; } } { std::cout << "set_intersection\n"; auto res = m1 | ranges::views::set_intersection(m2); for(auto&& p : res) { std::cout << p.first << ' ' << p.second << '\n'; } } { std::cout << "set_intersection and pipe\n"; auto res = ranges::views::set_intersection(m1, m2) | ranges::views::transform( [](auto&& p) { return 0; }); } return 0; }
内容的提问来源于stack exchange,提问作者fcc
相关产品推荐
相关产品推荐

