为何报错‘locate_zone’不是‘std::chrono’的成员?
解决
std::chrono::locate_zone编译错误的问题 先看你遇到的完整问题场景:
测试代码(test.cpp)
//test.cpp #include<chrono> #include<string> using namespace std; int main(){ string str("Europe/Oslo"); std::chrono::locate_zone(str); }
编译命令
/tools/gcc/6.3.0/bin/g++ --std=c++11 test.cpp
错误输出
test.cpp: In function ‘int main()’: test.cpp:6:3: error: ‘locate_zone’ is not a member of ‘std::chrono’ std::chrono::locate_zone(str); ^~~
错误原因
std::chrono::locate_zone是C++20标准才正式引入的时区查找函数,而你用的GCC 6.3.0是2016年的老版本,不仅完全不支持C20,就连C17的特性都只实现了一小部分。再加上你编译时指定了--std=c++11,编译器只会启用C11标准范围内的特性,自然找不到这个C20才有的函数。
解决办法
方法1:升级编译器并启用C++20标准
如果你的开发环境允许升级,建议把GCC升级到10.x及以上版本——GCC从10开始对C20的chrono时区模块支持才比较完善。之后修改编译命令,指定C20标准:
# 假设升级后的GCC路径为/tools/gcc/10.3.0/bin/g++ /tools/gcc/10.3.0/bin/g++ --std=c++20 test.cpp
升级后原代码就能正常编译运行,因为新版本GCC已经实现了C++20的std::chrono::locate_zone。
方法2:使用第三方兼容库(无需升级编译器)
如果没法升级编译器,可以用Howard Hinnant开发的date库——这个库是C20 chrono时区功能的原型实现,完美兼容C11/14/17。
用法步骤:
- 下载date库的头文件(仅需头文件,无需编译静态/动态库)
- 修改代码引入库的时区头文件,替换为库中的
locate_zone:
//test.cpp #include "date/tz.h" // 引入date库的时区头文件 #include<string> using namespace std; int main(){ string str("Europe/Oslo"); date::locate_zone(str); // 使用date库的locate_zone }
编译时依然用你的GCC 6.3.0,只需加上必要的链接参数:
/tools/gcc/6.3.0/bin/g++ --std=c++11 test.cpp -ldl -pthread
注:-ldl用于动态加载时区数据库,-pthread是线程支持依赖,这两个参数不能少。
内容的提问来源于stack exchange,提问作者w-begonia
相关产品推荐
相关产品推荐

