我试图写我自己的日志记录类,并把它作为一个流时:C++作为一个参数流重载运算符<<
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):
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’
所以,我一直试图超载运营商< <接受这种类型的流,但它让我很生气。我不知道该怎么做。我在一直寻找热塑成型,例如,在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”,而不是。
另一件事,我的错误是,在错误输出,为运营商< <变化的第一个参数,有时这是一个指针引用,有时看起来像一个双参考...
[性病:: ENDL的可能重复的是未知类型当重载运算符<<](http://stackoverflow.com/questions/1134388/stdendl-is-of-unknown-type-when-overloading-operator) – sth 2010-05-10 14:41:45
好问题。上周我遇到了同样的问题。在下面的答案中的经验悲伤的声音... – 2010-05-10 14:42:12
@ T.E.D .:嗯...谢谢你? – 2010-05-10 14:46:21