Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;重载运算符时作为参数的流<&书信电报;_C++_Operator Overloading_Stream_Endl - Fatal编程技术网

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操纵器,它是一个函子,通过引用接受流,对其执行某些操作,并返回该流(也通过引用)
cout
endl
是一只奇怪的野兽。它不是一个常数。实际上,它是一个函数。您需要一个特殊的重写来处理
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 );