无法格式化参数。要使类型 T 格式化,请提供格式器 <T>

问题描述 投票:0回答:2

所以我根据 thecherno 的教程创建一个游戏引擎,并添加 GLFW 错误处理(这是 C++),但我不知道在哪里以及如何为 SPDLOG 添加格式化程序 这是我的

Log.h
:

#define PL_CORE_TRACE(...)      ::Pluton::Log::GetCoreLogger()->trace(__VA_ARGS__)
#define PL_CORE_WARN(...)       ::Pluton::Log::GetCoreLogger()->warn(__VA_ARGS__)
#define PL_CORE_INFO(...)       ::Pluton::Log::GetCoreLogger()->info(__VA_ARGS__)
#define PL_CORE_ERROR(...)      ::Pluton::Log::GetCoreLogger()->error(__VA_ARGS__)
#define PL_CORE_FATAL(...)      ::Pluton::Log::GetCoreLogger()->fatal(__VA_ARGS__)

__VA_ARGS__
是提供给记录器的所有参数

我绑定了一个 OnEvent 函数,其日志如下:

    void Application::OnEvent(Event& e) {
    PL_CORE_INFO("{0}", e);
}

我将

glfwSetErrorCallback
事件绑定到 GLFWErrorCallback 函数,如下所示:

    static void GLFWErrorCallback(int error, const char* description) {
    PL_CORE_ERROR("GLFW Error ({0}): {1}",error,description);
}
//this is a snippit in Application::Init() which initializes GLFW
    if (!s_GLFWInitialized) {
                int success = glfwInit();
                PL_CORE_ASSERT("GLFW NOT INITIALIZED");
                glfwSetErrorCallback(GLFWErrorCallback);
                s_GLFWInitialized = true;
            }

我不断收到错误:

Cannot format an argument. To make type T formattable provide a formatter<T> specialization.

这是唯一的错误,并且没有指定哪个错误导致此错误以及哪种类型无法格式化。

编辑:

我创建了这个,我想将其返回为

Event
类型的格式,并将其放入我的
Log.cpp
文件中,该文件在每个使用事件的文件中导入。出现同样的错误

struct fmt::formatter<Pluton::Event> {
    constexpr auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) {
        return ctx.end();
    }

    template <typename FormatContext>
    auto format(const Pluton::Event& input, FormatContext& ctx) -> decltype(ctx.out()) {
        return format_to(ctx.out(),
            "(Name:{})",
            input.GetName() {});
    }

};
c++ glfw spdlog
2个回答
1
投票

#include <spdlog/fmt/ostr.h>
添加到
Log.h
文件。有了这个spdlog就可以在Event.h
中使用
operator<<


0
投票

更新后我找到了很好的解决方案

template<typename T> struct fmt::formatter<T, std::enable_if_t<std::is_base_of_v<JuicyEngine::Event, T>, char>> : fmt::formatter<std::string> { template <typename FormatContext> auto format(const T& event, FormatContext& ctx) const -> decltype(ctx.out()) { return fmt::formatter<std::string>::format(event.ToString(), ctx); } };
我们只需实现一个适用于 Event 及其子类的模板,例如在文件 Event.cpp 中

© www.soinside.com 2019 - 2024. All rights reserved.