gpt4 book ai didi

c++ - 无法在spdlog中格式化参数

转载 作者:行者123 更新时间:2023-12-01 14:47:38 24 4
gpt4 key购买 nike

我正在尝试使用spdlog。我将其与代码合并,但现在出现以下错误:

....fmt\core.h(1016): 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
....fmt/core.h(1013): note: while compiling class template member function 'int fmt::v6::internal::arg_mapper<Context>::map(...)'
with
[
Context=context
]
....fmt/core.h(1213): note: see reference to function template instantiation 'int fmt::v6::internal::arg_mapper<Context>::map(...)' being compiled
with
[
Context=context
]
....fmt/core.h(1027): note: see reference to class template instantiation 'fmt::v6::internal::arg_mapper<Context>' being compiled
with
[
Context=context
]
....fmt/core.h(1198): note: see reference to alias template instantiation 'fmt::v6::internal::mapped_type_constant<int,context>' being compiled
....fmt/core.h(1342): note: see reference to function template instantiation 'unsigned __int64 fmt::v6::internal::encode_types<Context,int,>(void)' being compiled
with
[
Context=context
]
....fmt/format.h(3375): note: see reference to class template instantiation 'fmt::v6::format_arg_store<context,int>' being compiled
....spdlog/details/fmt_helper.h(49): note: see reference to function template instantiation 'std::back_insert_iterator<fmt::v6::internal::buffer<char>> fmt::v6::format_to<char[6],int&,250,char>(fmt::v6::basic_memory_buffer<char,250,std::allocator<char>> &,const S (&),int &)' being compiled
with
[
S=char [6]
]

...,这是错误消息的结尾。它永远不会到达我的代码,所以我不知道在哪里看。任何想法可能是什么原因?

spdlog是版本1.6.1。最后一条错误线是从这里:
inline void pad2(int n, memory_buf_t &dest)
{
if (n >= 0 && n < 100) // 0-99
{
dest.push_back(static_cast<char>('0' + n / 10));
dest.push_back(static_cast<char>('0' + n % 10));
}
else // unlikely, but just in case, let fmt deal with it
{
fmt::format_to(dest, "{:02}", n); // <--- HERE
}
}

对我来说,这看起来并没有特别严重。

更新:在一些尝试和错误注释掉所有 spdlog调用后,我将其范围缩小到:
spdlog::info("Foo{}", Point{1, 2});
其中 Point是我自己的 namespace 中的我自己的类。我为它提供了一种打印自身的方法:
template<typename OStream>
OStream &operator<<(OStream &os, const Point &p) {
return os << "[" << p.x << ", " << p.y << "]";
}

最佳答案

spdlog使用{fmt}库格式化输出文本,并且需要<fmt/ostream.h>头文件to be included才能启用类似std::ostream的支持。

不管使用{fmt}库的外部实现,还是使用spdlog源代码本身的实现,都有一个特殊的头<spdlog/fmt/ostr.h>,其中包括正在使用的文件版本。

一旦包含,spdlog应该能够使用您的operator<<

另外,您可以创建一个自定义格式器,该格式器还可以解析格式字符串:

template <>
struct fmt::formatter<Point> {
constexpr auto parse(format_parse_context& ctx) {
return ctx.end();
}

template <typename Context>
auto format(const Point& p, Context& ctx) {
return format_to(ctx.out(), "[{}, {}]", p.x, p.y);
}
};

关于c++ - 无法在spdlog中格式化参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62320177/

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