c++ - 可变参数模板函数:没有匹配的调用函数,std::endl

标签 c++ c++11 variadic-templates

在我的代码中,我使用可变参数模板函数 进行日志记录。但是当我使用 std::endl 作为参数时,我得到以下编译器错误:

Error: no matching function for call to 'LOG_ERROR(const char [14], int&, )' LOG_ERROR("Sum of x+y = ", z, std::endl);

note: candidate: 'void LOG_ERROR()' inline void LOG_ERROR() {

note: candidate expects 0 arguments, 3 provided

我的代码:

#include <iostream>

inline void LOG_ERROR() { 
    std::cout << std::endl;
}

template<typename First, typename ...Rest>
void LOG_ERROR(First && first, Rest && ...rest){
    std::cout << std::forward<First>(first);
    LOG_ERROR(std::forward<Rest>(rest)...);
}

int main() {
    int foo=40;
    LOG_ERROR("My foo = ", foo, std::endl);
}

该代码在 "\n" 下运行良好,但我很想知道为什么它在 std::endl 下失败以及如何修复它

最佳答案

长话短说 - std::endl 是函数模板,在传递时无法推导模板参数。您可以通过这种方式帮助您的编译器:

LOG_ERROR("My foo = ", foo, std::endl<char, std::char_traits<char>>);

尽管我觉得这是一段丑陋的代码,但它运行得非常完美。

关于c++ - 可变参数模板函数:没有匹配的调用函数,std::endl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51871383/

相关文章:

c++ - 可变参数模板和 Alexandrescu 元组实现

c++ - 如何根据 C++ 中可变大小的模板模板列表获取元组?

c++ - 当 gcc 中的应用程序在没有 gdb 的情况下崩溃时如何生成堆栈转储和转储寄存器值?

c++ - webrtc 视频编码器通过 sdp 同步

c++ - 截取特定窗口的屏幕截图 - C++/Qt

c++ - 由于对模板化类型的通用(前向)引用而无法实例化函数模板

c++ - 对智能指针范围的困惑

模板参数列表的 C++ 别名

c++ - 如何使用 typedef 和可变参数模板包装除一个模板参数之外的所有模板参数?

c++ - boost::process 系统泄漏文件描述符