c++ - 为什么模板运算符<< 不推导出 std::endl?

标签 c++ templates iostream iomanip

<分区>

如果您取消注释第一个运算符定义,这将编译并运行:

#include <iostream>

struct logger
{
    std::ostream &loggingStream;
    logger(std::ostream &ls) : loggingStream(ls) {}

};

/*
logger &operator<<(logger &l, std::ostream & (*manip)(std::ostream &)) {
    manip(l.loggingStream);
    return l;
}
*/

template<typename T>
logger &operator<<(logger &l, const T &t) {
    l.loggingStream << t;
    return l;
}

int main() {
    logger l(std::cout);

    l << "Hello" << std::endl;
    return 0;
}

有了评论:

error: no match for ‘operator<<’ (operand types are ‘logger’ and ‘<unresolved overloaded function type>’)

为什么我需要提供一个非模板重载来处理 endl

最佳答案

std::endl本身就是一个模板。当你有第一个重载时,它的参数可以通过匹配函数指针来推导出来。因为那是 TAD 发生的一个例子。

只是 operator<<模板,有什么可以推导出来的?两个模板都需要推导它们的参数。

关于c++ - 为什么模板运算符<< 不推导出 std::endl?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55029240/

相关文章:

c - 在 Ubuntu 13.10 中找不到 gcc iostream

c++ - 使用 TBB 在并行循环结束时刷新线程本地缓冲区

c++ - 函数模板特化类型——它是可选的吗?

C++ "smart pointer"自动转换为裸指针但不能显式删除的模板

c++ - 防止 std::ifstream 创建空文件

c++ - 从 .txt 文件中获取混合数值

c++ - 在 C++ 中将正 float 组转换为带舍入的无符号短数组

c++ - 它有效,但它是对的吗?

c++ - 计算排序数组的成对绝对和的中位数的高效算法

c++ - 需要帮助使用 g++ 编译 vcglib 代码