Я пытаюсь реализовать свой собственный потоковый манипулятор в своем классе логирования. Это в основном манипулятор конца строки, который изменяет состояние флага. Однако, когда я попытаюсь использовать его, я получу:
ftypes.cpp:57: error: no match for ‘operator<<’ in ‘log->Log::debug() << log->Log::endl’
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/ostream.tcc:67: note: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>& (*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/ostream.tcc:78: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ios<_CharT, _Traits>& (*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/ostream.tcc:90: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base& (*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>]
...
Код:
class Log {
public:
...
std::ostream& debug() { return log(logDEBUG); }
std::ostream& endl(std::ostream& out); // manipulator
...
private:
...
std::ofstream m_logstream;
bool m_newLine;
...
}
std::ostream& Log::endl(std::ostream& out)
{
out << std::endl;
m_newLine = true;
return out;
}
std::ostream& Log::log(const TLogLevel level)
{
if (level > m_logLevel) return m_nullstream;
if (m_newLine)
{
m_logstream << timestamp() << "|" << logLevelString(level) << "|";
m_newLine = false;
}
return m_logstream;
}
Я получаю сообщение об ошибке при попытке вызвать его:
log->debug() << "START - object created" << log->endl;
(log - указатель на объект Log)
Есть идеи? Я подозреваю, что это как-то связано с тем фактом, что манипулятор на самом деле находится внутри класса, но это только мое дикое предположение ...
Приветствия
Tom
РЕДАКТИРОВАТЬ: Поместить это здесь вместо комментария из-за ограничения форматирования.
Я попытался реализовать свой streambuf, и он прекрасно работает с одним исключением: когда я пытаюсь открыть filebuf для добавления, это не удается. Вывод работает хорошо, просто добавить не по неизвестной причине. Если я пытаюсь использовать ofstream напрямую с append, это работает. Есть идеи почему? -
Работает:
std::ofstream test;
test.open("somefile", std::ios_base::app);
if (!test) throw LogIoEx("Cannon open file for logging");
test << "test" << std::endl;
Добавляет «test» правильно.
Не работает:
std::filebuf *fbuf = new std::filebuf();
if (!fbuf->open("somefile", std::ios_base::app)) throw LogIoEx("Cannon open file for logging");
Выдает исключение, если я установил openmode на out, то это сработает ..
Приветствия