Я пытаюсь написать свой собственный класс ведения журнала и использовать его в качестве потока:
logger L;
L << "whatever" << std::endl;
Это код, с которого я начал:
#include <iostream>
using namespace std;
class logger{
public:
template <typename T>
friend logger& operator <<(logger& log, const T& value);
};
template <typename T>
logger& operator <<(logger& log, T const & value) {
// Here I'd output the values to a file and stdout, etc.
cout << value;
return log;
}
int main(int argc, char *argv[])
{
logger L;
L << "hello" << '\n' ; // This works
L << "bye" << "alo" << endl; // This doesn't work
return 0;
}
Но я получаю сообщение об ошибке при попытке компилировать, говоря, что не было определения для оператора << (при использовании std :: endl): </p>
pruebaLog.cpp:31: error: no match for ‘operator<<’ in ‘operator<< [with T = char [4]](((logger&)((logger*)operator<< [with T = char [4]](((logger&)(& L)), ((const char (&)[4])"bye")))), ((const char (&)[4])"alo")) << std::endl’
Итак, я пытался перегрузить оператор <<, чтобы принять этот вид потоков, но это сводит меня с ума. Я не знаю, как это сделать. Например, я искал определение std :: endl в заголовочном файле ostream и написал функцию с таким заголовком: </p>
logger& operator <<(logger& log, const basic_ostream<char,char_traits<char> >& (*s)(basic_ostream<char,char_traits<char> >&))
Но не повезло. Я попробовал то же самое, используя шаблоны вместо прямого использования char, а также попробовал просто использовать "const ostream & os" и ничего.
Еще одна вещь, которая меня беспокоит, это то, что в выводе ошибки изменяется первый аргумент оператора <<, иногда это ссылка на указатель, иногда выглядит как двойная ссылка ... </p>