VS2019最新社区版中从date.h迁移至C++20 chrono库后parse函数报错问题求助
解决C++20 chrono库parse函数匹配错误的问题
嘿,这个问题我之前迁移代码的时候也碰到过!其实就是C++20标准库的std::chrono::parse和你之前用的date.h版本有个容易忽略的小差异,导致了重载匹配失败。
错误的核心原因
C++20的std::chrono::parse对格式参数的要求和date.h不一样:
- date.h的
parse可以直接接收字符串字面量,但C++20标准里的parse要求第一个参数是std::string_view类型(或者符合std::format_string要求的编译期常量),直接传"%Y-%m-%d %H:%M:%S"这种字符串字面量会因为类型不匹配找不到合适的重载。 - 另外你漏了一个关键头文件:
<sstream>!之前date.h可能间接帮你包含了它,但C++20的chrono库不会自动引入这个头,缺少它的话虽然不一定直接报这个错,但也是潜在问题。
修正后的代码
把你的C++20版本代码改成这样就可以正常运行了:
#include <chrono> #include <sstream> // 必须显式包含,处理istringstream #include <string> #include <string_view> // 如果用""sv字面量的话需要这个 auto StringToUnix(const std::string& source) -> std::time_t { using namespace std::chrono; std::istringstream in(source); sys_seconds tp{}; // 两种传递格式字符串的方式选一种就行 // 方式1:显式转为string_view in >> parse(std::string_view{"%Y-%m-%d %H:%M:%S"}, tp); // 方式2:用string_view字面量(需要包含<string_view>) // in >> parse("%Y-%m-%d %H:%M:%S"sv, tp); return system_clock::to_time_t(tp); }
额外注意事项
- 确保你的VS2019项目已经开启C20标准:右键项目 → 属性 → C/C → 语言 → C标准,选择
ISO C++20标准(/std:c++20),VS2019的早期版本对C20的chrono支持可能不全,建议升级到最新的社区版补丁。 - 格式语法和date.h基本兼容,你的
%Y-%m-%d %H:%M:%S格式完全可以正常使用,不需要修改。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

