gpt4 book ai didi

c++ - 为什么 fmt::format 不接受字符串作为参数?

转载 作者:行者123 更新时间:2023-12-05 03:48:17 25 4
gpt4 key购买 nike

我已经成功使用了 fmt图书馆之前,所以我不完全确定为什么我有这个问题。首先,我将向您展示产生错误的代码:

void Logger::AttachSink(const std::string & id, LogSink sink) {
using namespace std::literals;
auto id_found = sinks.find(id) != std::endl(sinks);
if(!id_found) {
sinks.insert(std::make_pair(id, sink));
Info(
fmt::format(
"Sink \"{}\" Attached"s,
id
) // This is the line where the error is apparently happening, and I'm assuming the `id` is the culprit for some reason.
);
}
}

这是构建日志(注意:我使用 VSCode 作为编辑器,使用 CMake 使用 Visual Studio 2019 的编译器构建项目):

[main] Building folder: [WORKSPACE]
[build] Starting build
[proc] Executing command: "C:\Program Files\CMake\bin\cmake.exe" --build [WORKSPACE]/build --config Debug --target ALL_BUILD -- /maxcpucount:6
[build] Microsoft (R) Build Engine version 16.7.0+b89cb5fde for .NET Framework
[build] Copyright (C) Microsoft Corporation. All rights reserved.
[build]
[build] logging.cpp
[build] [WORKSPACE]\build\vcpkg_installed\x64-windows\include\fmt\core.h(1073,9): error C2338: Cannot format argument. To make type T formattable provide a formatter<T> specialization: https://fmt.dev/latest/api.html#formatting-user-defined-types [[WORKSPACE]\build\drakeng\drakeng.vcxproj]
[build] [WORKSPACE]\build\vcpkg_installed\x64-windows\include\fmt\core.h(1070): message : while compiling class template member function 'int fmt::v7::detail::arg_mapper<Context>::map(...)' [[WORKSPACE]\build\drakeng\drakeng.vcxproj]
[build] with
[build] [
[build] Context=fmt::v7::basic_format_context<std::back_insert_iterator<fmt::v7::detail::buffer<char>>,char>
[build] ]
[build] [WORKSPACE]\build\vcpkg_installed\x64-windows\include\fmt\core.h(1259): message : see reference to function template instantiation 'int fmt::v7::detail::arg_mapper<Context>::map(...)' being compiled [[WORKSPACE]\build\drakeng\drakeng.vcxproj]
[build] with
[build] [
[build] Context=fmt::v7::basic_format_context<std::back_insert_iterator<fmt::v7::detail::buffer<char>>,char>
[build] ]
[build] [WORKSPACE]\build\vcpkg_installed\x64-windows\include\fmt\core.h(1084): message : see reference to class template instantiation 'fmt::v7::detail::arg_mapper<Context>' being compiled [[WORKSPACE]\build\drakeng\drakeng.vcxproj]
[build] with
[build] [
[build] Context=fmt::v7::basic_format_context<std::back_insert_iterator<fmt::v7::detail::buffer<char>>,char>
[build] ]
[build] [WORKSPACE]\build\vcpkg_installed\x64-windows\include\fmt\core.h(1241): message : see reference to alias template instantiation 'fmt::v7::detail::mapped_type_constant<const std::basic_string<char,std::char_traits<char>,std::allocator<char>>,Context>' being compiled [[WORKSPACE]\build\drakeng\drakeng.vcxproj]
[build] with
[build] [
[build] Context=fmt::v7::basic_format_context<std::back_insert_iterator<fmt::v7::detail::buffer<char>>,char>
[build] ]
[build] [WORKSPACE]\build\vcpkg_installed\x64-windows\include\fmt\core.h(1400): message : see reference to function template instantiation 'unsigned __int64 fmt::v7::detail::encode_types<Context,const std::basic_string<char,std::char_traits<char>,std::allocator<char>>,>(void)' being compiled [[WORKSPACE]\build\drakeng\drakeng.vcxproj]
[build] with
[build] [
[build] Context=fmt::v7::basic_format_context<std::back_insert_iterator<fmt::v7::detail::buffer<char>>,char>
[build] ]
[build] [WORKSPACE]\build\vcpkg_installed\x64-windows\include\fmt\core.h(1834): message : see reference to class template instantiation 'fmt::v7::format_arg_store<fmt::v7::basic_format_context<std::back_insert_iterator<fmt::v7::detail::buffer<char>>,char>,const std::basic_string<char,std::char_traits<char>,std::allocator<char>>>' being compiled [[WORKSPACE]\build\drakeng\drakeng.vcxproj]
[build] [WORKSPACE]\drakeng\logging.cpp(24): message : see reference to function template instantiation 'std::basic_string<char,std::char_traits<char>,std::allocator<char>> fmt::v7::format<std::string,const std::string&,char>(const S &,const std::string &)' being compiled [[WORKSPACE]\build\drakeng\drakeng.vcxproj]
[build] with
[build] [
[build] S=std::string
[build] ]
[build] Build finished with exit code 1

这些错误让它听起来像 fmt没有 fmt::formatter<std::string>特化对我来说听起来不对,所以我要么配置错误,要么不包含标题或其他内容。坦率地说,我很困惑。一旦我得到答案,知道我的运气可能会很愚蠢。无论如何,提前感谢您提供的任何帮助。

最佳答案

好吧,显然这个错误不是由我认为的原因引起的(谢谢,Visual C++ 编译器错误消息, super 有用!/s)。因此,要解释实际发生的事情:

  • Logger::Info调用一个更通用的函数 Logger::Log(LoggingLevel level, const std::string & message) .
  • Logger::Log也叫 fmt::format在其中格式化一些附加信息以保存到日志中。
  • fmt::format 的论点之一电话是level然后需要将其转换为字符串(我选择创建一个 ToString 函数而不是为其创建一个 fmt::formatter)。
  • 问题是 ToString函数返回 std::optional<std::string> “干净地”处理无效值。好吧,显然我忘了调用.value_or在返回值上,THAT 是导致错误的原因。

不幸的是,没有一条错误消息甚至提到与该行有关的任何内容,因此浪费了相当多的几分钟/几小时。

关于c++ - 为什么 fmt::format 不接受字符串作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64508627/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com