错误 C2661 'fmt::v7::print': 没有重载函数接受 3 个参数

Error C2661 'fmt::v7::print': no overloaded function takes 3 arguments

我正在尝试做 :

fmt::print(fg(fmt::color::red), "A critical error has occured. consult the logs and fix the issue! {0}", std::endl);

这会导致错误消息:Error C2661 'fmt::v7::print': no overloaded function takes 3 arguments

查看官方文档 here 显示 fmt::print 为:

 template <typename S, typename... Args>
void fmt::print(const text_style &ts, const S &format_str, const Args&... args)

这表明参数的数量不应该是一个问题,事实上,它不是。如果我用 1 这样随机的东西替换 std::endl ,它编译和构建就很好了!这里有什么问题?

std::endl 是一个模板,但在这种情况下无法确定模板参数,您必须明确指定它们。例如

fmt::print(fg(fmt::color::red), 
           "A critical error has occured. consult the logs and fix the issue! {0}", 
           std::endl<char, std::char_traits<char>>);
//                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

错误消息在技术上是不正确的,因为有一个 fmt::print 重载需要 3 个参数。但是,即使您能够传递 std::endl,也没有意义,因为刷新将应用于中间缓冲区,而不是写入 stdout 时。您应该使用 \n 并改为调用 fflush

fmt::print(fg(fmt::color::red),
           "A critical error has occured. consult the logs and fix the issue!\n");
fflush(stdout);

请注意,显式传递模板参数将不起作用 - 您只会收到不同的错误:https://godbolt.org/z/T3GYqdchb.