C++ C++;重载运算符时作为参数的流<&书信电报;
我正在尝试编写自己的日志类并将其用作流:C++ C++;重载运算符时作为参数的流<&书信电报;,c++,operator-overloading,stream,endl,C++,Operator Overloading,Stream,Endl,我正在尝试编写自己的日志类并将其用作流: logger L; L << "whatever" << std::endl; L; 在C++中,L*P>是封装了底层I/O机制的流缓冲区< /强>。流本身只封装到字符串的转换和I/O方向 因此,您应该使用一个预定义的流类,而不是创建自己的流类。如果您有一个新的目标,希望I/O转到该目标(如系统日志),那么您应该创建自己的流缓冲区(源自std::streambuf) endl是一个IO操纵器,它是一个函子,通过引用接受流,对其执
logger L;
L << "whatever" << std::endl;
L;
在C++中,L*P>是封装了底层I/O机制的<强>流缓冲区< /强>。流本身只封装到字符串的转换和I/O方向
因此,您应该使用一个预定义的流类,而不是创建自己的流类。如果您有一个新的目标,希望I/O转到该目标(如系统日志),那么您应该创建自己的流缓冲区(源自std::streambuf
) endl
是一个IO操纵器,它是一个函子,通过引用接受流,对其执行某些操作,并返回该流(也通过引用)coutendl
是一只奇怪的野兽。它不是一个常数。实际上,它是一个函数。您需要一个特殊的重写来处理endl
的应用程序:
logger& operator<< (logger& log, ostream& (*pf) (ostream&))
{
cout << pf;
return log;
}
也就是说,它可以将任何类型的ostream
作为其输入和输出。所以问题不在于编译器无法推断t const&
可能是函数指针,而是它无法确定要传入的endl
。operator的模板版本我相信问题在于您的流没有过载operator的可能重复[std::endl在重载运算符时属于未知类型良好的问题。我上周遇到了完全相同的问题。下面的答案中有悲伤的经验之声…@T.E.D.:嗯…谢谢?谢谢!这就解决了问题。现在我看到了您的解决方案,我发现我的定义basic_ostream&(*s)(basic_ostream&)
是ostream的通用版本,但由于定义为“const”而无法正常工作。一旦我去掉常量,它就工作了。对我来说,真正的问题仍然存在,那就是为什么编译器不能将t作为函数指针推导并绑定到它?这比公认的答案更复杂,但仍然是一种有趣的方法。@FranticPedantic:真的是一个硬币的两面。
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’
logger& operator <<(logger& log, const basic_ostream<char,char_traits<char> >& (*s)(basic_ostream<char,char_traits<char> >&))
logger& operator<<(logger&(*function)(logger&)) {
return function(*this);
}
logger& newline(logger& L) {
return L << '\n';
}
logger& operator<< (logger& log, ostream& (*pf) (ostream&))
{
cout << pf;
return log;
}
template <class charT, class traits>
basic_ostream<charT,traits>& endl ( basic_ostream<charT,traits>& os );