C++运算符的链接<<对于 std::cout 之类的用法
可能的重复:
重载运算符时 std::endl 的类型未知<<
运算符重载
我目前正在编写一个记录器类,但是operator<<
方法会导致编译器错误。这是该类的最小化版本,位于文件“logger.h”中:
#include <iostream>
class Logger {
public:
Logger() : m_file(std::cout) {}
template <typename T>
Logger &operator<<(const T &a) {
m_file<<a;
return *this;
}
protected:
std::ostream& m_file;
};
它包含在我的 main.cpp 中,并且当我输出字符串文字时可以正常工作:
log << "hi";
但是,以下内容将无法编译。
#include "logger.h"
int main() {
Logger log;
log << std::endl;
}
g++ 编译器报告:
src/main.cpp:5:错误:与“operator<<”不匹配在'日志<< std::endl'
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您的问题不是关于
<<
链,而是单个log << endl
也会导致问题。这是因为std::endl
是一个模板函数:basic_ostream
中operator<<
的重载之一是:所以模板参数当使用
std::cout<时可以推导出来。但是,当左侧是
class Logger
时,编译无法推导出endl
的模板参数。显式给出模板参数可以让程序编译并运行:或者可以在
class Logger
中添加新的operator<<
重载,让编译器推导出<的模板参数code>std::endl:另外,如果不需要立即刷新输出,可以使用 '\n' 代替
endl
。Your problem is not about the chain of
<<
, a singlelog << endl
would also cause the problem. It is becausestd::endl
is a template function:One of the overload of
operator<<
inbasic_ostream
is:So the template parameters can be deduced when
std::cout<<std::endl
is used. However, when the left side is theclass Logger
, the compile cannot deduce the template parameters ofendl
. Explicitly give the template parameters can let program compile and work:Or you can add a new overload of
operator<<
inclass Logger
to let compiler deduce the template parameters ofstd::endl
:Also, if you don't need the output to be flushed immediately, you can use '\n' instead of
endl
.该错误是由函数
std::endl
引起的。参考:重载运算符时std::endl的类型未知<< ;
The error is caused by
std::endl
which is a function. Refer to:std::endl is of unknown type when overloading operator<<