質問

私は検査の既存コードを見つけ出す動作が異なようにコンパイルされてVisual C++9MinGW:

inline LogMsg& LogMsg::operator<<(std::ostream& (*p_manip)(std::ostream&) )
{
    if ( p_manip == static_cast< std::ostream& (*)(std::ostream&) > ( &std::endl<char, std::char_traits<char> >) )
    {
        msg(m_output.str());
        m_output.str( "" );
    }
    else
    {
        (*p_manip) (m_output);            // or // output << p_manip;
    }
    return *this;
}

その名の通り、このはログのクラスで過負荷 operator<<() グレーのクラムシェル型クランプendlsからストリームです。

ことが判明したのはなぜでの動作異なる:この試験 p_manip == static_cast... が成功するとMinGWが失敗したVisual C++9.

  • MinGW"無視"のキャストを返します実際のアドレス std::endl;
  • Visual C++9実際にかぶりのポインタをァイルを返します別のアドレスです。

変更しましたが、本試験の結果をもとに、 if ( p_manip == std::endl ) このとして振る舞うと考えられています。

私の質問は、:何の理由などの複雑な(していすが、間違った)です。


のためのcompletness:

class LogStream
{
public:
    LogStream() {}
protected:
    std::ostringstream m_output;
};

class LogMsg : public LogStream
{
    friend LogMsg& msg() ;
    static LogMsg s_stream;
public:
    LogMsg() {}
    template <typename T>
        inline LogMsg& operator<<(T p_data);
    inline LogMsg& operator<<(std::ostream& (*p_manip)(std::ostream&) );
};
役に立ちましたか?

解決 2

詳細については、

ステートメントif ( p_manip == std::endl )は、元のコンパイラでコンパイルしません(GCC 3.4.5、コードが最初に開発されたコンパイラ)。

テストは間違っていなかったことを意味しますが、私は私の質問で述べたようにます。

他のヒント

の推測では、私は元の著者は、彼らが互換性のある型だった実現しなかったと言うと、(に彼を必要とせずに、コンパイラ)仕様に変換をしたと思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top