Ответ 1
Ваша проблема не в цепочке <<
, один 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
.