【发布时间】:2019-07-28 11:32:12
【问题描述】:
如果您取消注释第一个运算符定义,这将编译并运行:
#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?
【问题讨论】:
-
1/ 见stackoverflow.com/q/1134388/136208 2/ 编写自定义流缓冲区是 IO 子系统为此类扩展而设计的方式
标签: c++ templates iostream iomanip