我正在尝试编写自己的日志记录类并将其用作流:
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;
}
但是我在尝试编译时遇到错误,说没有 operator<< 的定义(使用 std::endl 时):
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’
所以,我一直试图重载 operator<< 来接受这种流,但这让我发疯。我不知道该怎么做。例如,我一直在查看 ostream 头文件中 std::endl 的定义,并使用此头文件编写了一个函数:
logger& operator <<(logger& log, const basic_ostream<char,char_traits<char> >& (*s)(basic_ostream<char,char_traits<char> >&))
但没有运气。我尝试过使用模板而不是直接使用 char,也尝试过简单地使用“const ostream& os”,但什么也没有。
让我烦恼的另一件事是,在错误输出中, operator<< 的第一个参数发生了变化,有时它是对指针的引用,有时看起来像双重引用......