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 &lt;string&gt; 好的。我认为你应该写出解决方案,因为我只给出了提示,而且你比我更了解这个库。 【参考方案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 错误

C++ SPDLOG 编译错误:变量或字段“set_error_handler”声明为无效

通过复制包含目录的内容来安装 spdlog

无法从 spdlog 中格式化参数

为啥我不能链接到用柯南安装的 spdlog 库

spdlog源码分析