spdlog 错误:“不知道如何格式化类型,包括 fmt/ostream.h 如果它提供了应该使用的 operator<<”
Posted
技术标签:
【中文标题】spdlog 错误:“不知道如何格式化类型,包括 fmt/ostream.h 如果它提供了应该使用的 operator<<”【英文标题】:spdlog error: "don't know how to format the type, include fmt/ostream.h if it provides an operator<< that should be used" 【发布时间】:2018-11-22 14:15:17 【问题描述】:我刚刚开始使用 spdlog 来改进我们的日志记录。我们的日志记录非常基础,所以我只是几乎逐字复制“多接收器”示例以记录到文件和控制台。
但是,即使完全按照示例进行操作,我也会得到:
错误 C2338 不知道如何格式化类型,包括 fmt/ostream.h 如果它提供了应该使用的操作符
来自 core.h:
// A formatter for objects of type T.
template <typename T, typename Char = char, typename Enable = void>
struct formatter
static_assert(no_formatter_error<T>::value,
"don't know how to format the type, include fmt/ostream.h if it provides "
"an operator<< that should be used");
我认为这很容易解决,但我看不到它......
[Win32基本用法]
【问题讨论】:
您可能想添加一个minimal reproducible example 另外,您可能需要指定您的环境,例如您的编译器版本、操作系统等。 你有没有像错误提示的那样尝试include fmt/ostream.h
?
@MikeSadler 您要格式化什么类型?胡思乱想——您是否使用std::string
或类似名称,却忘记在您的源代码中使用#include <string>
?
好的。我认为你应该写出解决方案,因为我只给出了提示,而且你比我更了解这个库。
【参考方案1】:
@PaulMcKenzie 为我指明了正确的方向,看来我正在尝试记录 spdlog 默认无法处理的字符串类型(std::wstrings)。
Visual Studio 的 Intellisense 似乎被模板弄糊涂了,使它看起来对我发送 spdlog::warn 一个 std::wstring 感到满意。
解决方案:要么只使用 std::string,要么如果你想使用 wstrings,你(可能)需要为它们定义一个自定义格式化程序。
【讨论】:
您可以在包含 spdlog.h 之前定义 SPDLOG_WCHAR_TO_UTF8_SUPPORT 以像这样格式化 wstring: logger->info(L”some wstring param: ”, wstr);以上是关于spdlog 错误:“不知道如何格式化类型,包括 fmt/ostream.h 如果它提供了应该使用的 operator<<”的主要内容,如果未能解决你的问题,请参考以下文章
Spdlog 和 VS2019 Intellisense 错误