如何在g++ 10中正确使用ranges?编译报错ranges未声明如何解决
修复方案
核心问题点
- 缺少
std命名空间前缀:C++标准库的ranges相关组件均定义在std命名空间下,你代码中直接使用ranges::view::filter未加前缀,编译器无法找到对应声明。 - 命名空间拼写错误:标准要求的范围适配器命名空间为
std::ranges::views(复数形式),不是单数view。 - GCC版本兼容问题:GCC 10.3对C++20 ranges的支持为部分实现,部分适配器功能不稳定,
std::views简写别名从GCC 11版本才开始支持。
修改后代码
#include <concepts> #include <exception> #include <iostream> #include <ranges> #include <vector> int main(int argc, char** argv){ std::vector<int> elements{1,2,3,4,5,6,7,8,9}; // GCC10 请使用完整命名空间:std::ranges::views::filter // GCC11及以上可以用简写 std::views::filter for(auto current: elements | std::ranges::views::filter([](auto e){return e%2==0;})){ std::cout << current << " "; } return 0; }
编译命令
使用如下命令编译即可,GCC同时支持单横杠-std和双横杠--std写法,无功能差异:
g++ -std=c++20 main.cpp
补充说明
如果修改代码后仍然存在编译报错,建议升级GCC到11及以上版本,该版本开始对C++20 ranges特性提供完整稳定的支持。
内容的提问来源于stack exchange,提问作者Arsen Zahray
相关产品推荐
相关产品推荐

