可能重复:
std::endl is of unknown type when overloading operator<<
Operator overloading
我目前正在编写一个记录器类,但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&lt;&lt;'在'log&lt;&lt;的std :: ENDL'
答案 0 :(得分:13)
您的问题与<<
链无关,单log << endl
也会导致问题。这是因为std::endl
是模板函数:
template <class charT, class traits>
basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
operator<<
中basic_ostream
的一个重载是:
template <class charT, class traits = char_traits<charT> >
class basic_ostream : virtual public basic_ios<charT,traits> {
public:
basic_ostream<charT,traits>& operator<<(
basic_ostream<charT,traits>& (*pf)(basic_ostream<charT,traits>&));
//...
};
因此,在使用std::cout<<std::endl
时可以推导出模板参数。但是,当左侧是class Logger
时,编译不能推导出endl
的模板参数。明确给出模板参数可以让程序编译和工作:
#include <iostream>
class Logger
{
public:
std::ostream &m_file;
Logger(std::ostream &o = std::cout):m_file(o){};
template <typename T>
Logger &operator<<(const T &a) {
m_file<<a;
return *this;
}
};
int main()
{
Logger log;
log<<std::endl<char, std::char_traits<char> >;
log<<"hi"<<" stackoverflow"<<std::endl<char, std::char_traits<char> >;
return 0;
}
或者您可以在operator<<
中添加class Logger
的新重载,让编译器推导出std::endl
的模板参数:
#include <iostream>
class Logger
{
public:
std::ostream &m_file;
Logger(std::ostream &o = std::cout):m_file(o){};
template <typename T>
Logger &operator<<(const T &a) {
m_file<<a;
return *this;
}
Logger &operator<<(std::ostream& (*pf) (std::ostream&)){
m_file<<pf;
return *this;
}
};
int main()
{
Logger log;
log<<std::endl;
log<<"hi"<<" stackoverflow"<<std::endl;
return 0;
}
此外,如果您不需要立即刷新输出,则可以使用'\ n'而不是endl
。
答案 1 :(得分:0)
错误是由std::endl
引起的,这是一个函数。请参阅: