5

次のコードの問題を見つけるのを手伝ってくれませんか (コードは、 operator<< をオーバーロードするときのパラメーターとしての C++ ストリームに似ています)。

#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;
}

「世界」を含む行のコメントを外すまで、すべてが正常に機能します。この場合、GCC はエラーを生成します: no match for 'operator<<' in ...

興味深いことに、VS2008 ではこのコードに問題はありません。

ありがとうございました!

4

1 に答える 1

12

std::string( "world" )非定数参照にバインドできない一時的なものを作成します。パラメータにconstを追加します。

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

編集:これがMSVSで機能するとおっしゃっていたことに気づきました。これは、MS言語拡張機能が原因であり、これをオフにすると、エラーが表示されます。MSVSを使用するときはいつでも、言語拡張機能をオフにします。

于 2012-08-07T17:32:52.663 に答える