2012-08-07 13 views
5

は、次のコードで 問題を見つけることで私を助けてもらえ(コードはC++ stream as a parameter when overloading operator<<に似ています):「エラー:演算子<<」の不一致」のstd ::文字列を扱うとき

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

"world"を含む行のコメントを解除するまでは、すべてうまく動作します。この場合、GCCは エラーを出力します。「演算子< <」と一致しません。

このコードではVS2008に問題はありません。

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

+0

ビジュアルスタジオは、他のコンパイラではできない多くの型変換を行います。 try std :: string( "world").c_str(); – steveg89

答えて

12

std::string("world")は、非const参照にバインドできない一時的なオブジェクトを作成します。 constをパラメータに追加してください:

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

EDIT:これはMSVSで動作すると言われています。これは、MSの言語拡張のために無効にすることができ、それもエラーを表示します。 MSVSを使用するたびに、言語拡張機能を無効にします。

+2

MSVCは、非コンス(nonconst)参照を作成できるようにC++を拡張しました。これは、コンパイラ間の不一致を説明しています。これをコンパイラオプションで無効にすることは可能ですが、多くのMSヘッダーが機能しません。 –

+0

@MagnusHoff私はその部分に気付かなかったが、あなたは正しい。私はそれらの拡張子が嫌いです。 –

関連する問題