使用流操作符<&书信电报;使用c+中的std::endl+; 我正在试用下面的C++类来使用流操作符,你需要一些类似于操作符的东西,看看我的答案。希望它有用@IgorTandetnik即使我知道可以通过添加重载来修复此错误,但我真的想知

使用流操作符<&书信电报;使用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+中的std::endl+;

我正在试用下面的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;
                                    ^~~~