VS2022编译date库parse函数报错,Linux下GCC11正常如何解决?
Visual Studio 2022编译date库parse函数报错,Linux下正常运行的解决方案
环境与问题背景
- 通过
vcpkg install date:x64-windows安装date库,跨平台项目中使用find_package(date CONFIG REQUIRED)引入,已确认库文件定位成功(date_FOUND="1"),路径为C:\Dev\vcpkg\installed\x64-windows\include\date\date.h。 - 项目配置了
set(CMAKE_CXX_STANDARD 20),使用Visual Studio 2022 Community编译时,执行字符串转time_point的代码报错,但相同代码在Linux环境(gcc11,通过./vcpkg install date:x64-linux安装库)下可正常编译运行。
出错代码
const std::string timeString = "2020-12-18 12:30:45"; const char *fmt = "%F"; std::istringstream in(timeString); std::chrono::time_point<std::chrono::system_clock> timeStamp; in >> date::parse(fmt, timeStamp);
编译错误信息
error C2672: 'date::parse': no matching overloaded function found C:\Dev\vcpkg\installed\x64-windows\include\date/date.h(8169): note: could be 'unknown-type date::parse(const CharT *,Parsable &,std::basic_string<CharT,Traits,Alloc> &,std::chrono::minutes &)'
链接配置
target_link_libraries(main PRIVATE date::date date::date-tz)
解决方案
1. 强制开启完整C++20标准支持
Visual Studio 2022默认的C++20模式可能未启用全部特性,在CMake中添加以下配置确保标准一致性:
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF)
也可直接在Visual Studio项目属性中,将C++语言标准设置为ISO C++20标准(/std:c++20),而非预览模式。
2. 修正parse函数的参数匹配
Windows下MSVC的模板重载匹配逻辑更严格,可通过以下方式调整代码:
// 方式1:用std::string替代const char*作为格式参数 const std::string fmt = "%F"; in >> date::parse(fmt, timeStamp); // 方式2:直接传递字符串字面量,避免指针类型匹配问题 in >> date::parse("%F", timeStamp); // 方式3:显式指定模板参数 in >> date::parse<char>(fmt, timeStamp);
3. 同步Windows与Linux的date库版本
检查两边安装的库版本是否一致,执行vcpkg list date查看版本号。若Windows侧版本较旧,更新库:
vcpkg update date vcpkg install date:x64-windows --recurse
4. 改用sys_days中转解析
如果上述方法无效,可先解析到date::sys_days类型,再转换为system_clock::time_point:
#include <date/date.h> // ... date::sys_days tp; in >> date::parse("%F", tp); std::chrono::time_point<std::chrono::system_clock> timeStamp = tp;
内容的提问来源于stack exchange,提问作者shashashamti2008
相关产品推荐
相关产品推荐

