使用流操作符<&书信电报;使用c+中的std::endl+; 我正在试用下面的C++类来使用流操作符,你需要一些类似于操作符的东西,看看我的答案。希望它有用@IgorTandetnik即使我知道可以通过添加重载来修复此错误,但我真的想知
使用流操作符<&书信电报;使用c+中的std::endl+;使用流操作符<&书信电报;使用c+中的std::endl+; 我正在试用下面的C++类来使用流操作符,你需要一些类似于操作符的东西,看看我的答案。希望它有用@IgorTandetnik即使我知道可以通过添加重载来修复此错误,但我真的想知,c++,templates,iostream,iomanip,C++,Templates,Iostream,Iomanip,使用流操作符<&书信电报;使用c+中的std::endl+; 我正在试用下面的C++类来使用流操作符,你需要一些类似于操作符的东西,看看我的答案。希望它有用@IgorTandetnik即使我知道可以通过添加重载来修复此错误,但我真的想知道为什么const T&与std::endl不匹配。我甚至尝试了一个更宽容的,它也不匹配。编译器说无法推断模板参数“t”。为什么?难道t不能与世界上的任何东西相匹配吗?@Telokis不是世界上的任何东西T可以从对象或函数(具有类型的事物)中推
我正在试用下面的C++类来使用流操作符,你需要一些类似于<代码>操作符的东西,看看我的答案。希望它有用@IgorTandetnik即使我知道可以通过添加重载来修复此错误,但我真的想知道为什么
const T&
与std::endl
不匹配。我甚至尝试了一个更宽容的,它也不匹配。编译器说无法推断模板参数“t”
。为什么?难道t
不能与世界上的任何东西相匹配吗?@Telokis不是世界上的任何东西T
可以从对象或函数(具有类型的事物)中推导出来。但是std::endl
不是一个函数,它是一个函数模板-一个无限的函数族,所有的函数类型都不同。在为T
了解和推导其类型之前,需要推导或明确指定其自身的模板参数。因此,log@IgorTandetnik好吧,经过这么多年的思考,我终于明白了!谢谢你的精确性。我完全没有意识到这不仅仅是一个函数。
class Log
{
public:
Log()
: m_filename( "dafault.log" )
{}
// if you wanna give other names eventually...
Log( const std::string & p_filename )
: m_filename( p_filename )
{}
virtual ~Log()
{
// implement your writeToFile() with std::ofstream
writeToFile( m_filename, m_stream, true );
}
template< typename T >
Log & operator<<( const T & p_value )
{
m_stream << p_value;
return *this;
}
private:
std::string m_filename;
std::ostringstream m_stream;
};
Log( "/tmp/my.log" ) << 1 << std::endl;
/usr/include/c++/7/string_view:558:5: note: template argument deduction/substitution failed:
My.cpp:375:36: note: 'Log' is not derived from 'std::basic_ostream<_CharT, _Traits>'
Log( "/tmp/my.log" ) << 1 << std::endl;
^~~~