/usr/include/spdlog/fmt/bundled/core.h: In instantiation of ‘fmt::v9::detail::value<Context> fmt::v9::detail::make_value(T&&) [with Context = fmt::v9::basic_format_context<fmt::v9::appender, char>; T = cv::Rect_<int>&]’:
时间: 2023-08-04 09:09:36 浏览: 114
这看起来像是一个编译错误,具体来说是在使用spdlog库的时候出现的问题。根据错误信息,似乎是在调用`make_value`函数时,给它传递了一个`cv::Rect_<int>`类型的参数,而这个类型的参数在该函数中无法被正确处理。建议检查代码中调用该函数的部分,看看是否存在参数类型不匹配的问题,或者尝试升级spdlog库版本以解决该问题。
相关问题
/usr/include/spdlog/fmt/bundled/core.h: In instantiation of ‘fmt::v8::detail::value<Context> fmt::v8::detail::make_arg(T&&) [with bool IS_PACKED = true; Context = fmt::v8::basic_format_context<fmt::v8::appender, char>; fmt::v8::detail::type <anonymous> = (fmt::v8::detail::type)15; T = cv::Rect_<int>&; typename std::enable_if<IS_PACKED, int>::type <anonymous> = 0]’:
这是一个 C++ 的编译错误信息,其中涉及到 fmt 库的模板实例化。在这段错误信息中,模板参数包括了一个 bool 类型的 IS_PACKED、一个 fmt::v8::basic_format_context<fmt::v8::appender, char> 类型的 Context,还有一个 T 类型的参数,它是一个 cv::Rect_<int>& 的左值引用。同时,还有一个 typename std::enable_if<IS_PACKED, int>::type 类型的匿名参数。根据这些参数,编译器尝试实例化 fmt::v8::detail::make_arg 函数模板,但是由于参数无法匹配模板的定义,导致编译错误。具体的错误原因需要结合代码上下文来分析。
/usr/include/spdlog/logger.h:90:9: required from ‘void spdlog::logger::log(spdlog::source_loc, spdlog::level::level_enum, fmt::v8::format_string<T ...>, Args&& ...) [with Args = {cv::Rect_<int>&}; fmt::v8::format_string<T ...> = fmt::v8::basic_format_string<char, cv::Rect_<int>&>]’
这个错误提示出现在 `spdlog` 库的 `logger.h` 文件中,它表示在使用 `spdlog` 记录日志时,传递了一个 `cv::Rect_<int>&` 类型的参数,这个类型无法被格式化输出。具体来说,`fmt` 库不知道如何将这个类型转换成字符串,所以编译器报错了。
为了解决这个问题,你需要为 `cv::Rect_<int>&` 类型提供一个格式化器,告诉 `fmt` 库如何将它转换成字符串。具体的做法是,在你的代码中实现一个 `formatter<cv::Rect_<int>&>` 类型的类,然后在这个类中实现 `format` 函数,将 `cv::Rect_<int>&` 类型转换成字符串。然后将这个格式化器传递给 `spdlog::logger` 对象,让它在记录日志时使用这个格式化器。
下面是一个示例:
```c++
#include <fmt/format.h>
#include <spdlog/spdlog.h>
template <>
struct fmt::formatter<cv::Rect_<int>&> {
template <typename ParseContext>
constexpr auto parse(ParseContext& ctx) { return ctx.begin(); }
template <typename FormatContext>
auto format(const cv::Rect_<int>& rect, FormatContext& ctx) {
return fmt::format_to(ctx.out(), "{{ x:{}, y:{}, width:{}, height:{} }}", rect.x, rect.y, rect.width, rect.height);
}
};
int main() {
auto logger = spdlog::stdout_logger_mt("console");
cv::Rect_<int> rect(10, 20, 30, 40);
logger->info("Rect: {}", rect);
return 0;
}
```
在这个示例中,我们为 `cv::Rect_<int>&` 类型提供了一个格式化器 `formatter<cv::Rect_<int>&>`,然后在使用 `spdlog` 记录日志时,传递了一个 `cv::Rect_<int>&` 类型的参数,让它使用我们自己实现的格式化器输出日志。
阅读全文