"错误:使用std :: string时不匹配'operator <<"

Ser*_*e C 5 c++ string iostream

你可以帮我找到下面代码中的问题(代码类似于C++流作为重载operator <<时的参数):

#include <iostream>
#include <string>

class logger
{
  public:
    void init( std::ostream& ostr )
    {
        stream = &ostr;
    }

    template< typename t >
    logger& operator <<( t& data )
    {
        *stream << data;
        return *this;
    }

    logger& operator <<( std::ostream& (*manip)(std::ostream &) )
    {
        manip( *stream );
        return *this;
    }

    logger& operator <<( std::ios_base& (*manip)(std::ios_base&) )
    {
        manip( *stream );
        return *this;
    }

  private:
    std::ostream* stream;
};

int main( int argc, char* argv[] )
{
    logger log;
    log.init( std::cout );
    log << "Hello" << std::endl;
    //log << std::string( "world" ) << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

一切正常,直到我取消注释包含"世界"的行.在这种情况下,GCC产生错误:在......中没有匹配'operator <<'

有趣的是,VS2008对此代码没有任何问题.

谢谢!

Luc*_*ore 12

std::string( "world" )创建一个不能绑定到非const引用的临时表.将const添加到参数:

template< typename t >
logger& operator <<( t const& data )
{
    *stream << data;
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

编辑:刚刚注意到你提到这在MSVS中有效.这是因为MS语言扩展,可以关闭,它也会显示de error.每当我使用MSVS时,我都会关闭语言扩展.

  • MSVC扩展了C++以便能够创建非`constst`引用.这解释了编译器之间的差异.可以使用编译器选项禁用它,但是有很多MS头不起作用. (2认同)