Frage

Ich Inspektion ein Stück bestehenden Code und fand heraus, es anders verhält, wenn mit Visual C ++ kompiliert 9 und MinGW:

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

Wie der Name schon sagt, ist dies eine Log-Klasse und es Überlastungen operator<<() zu Streife endls aus dem Stream.

fand ich heraus, warum es sich anders verhält. Der Test p_manip == static_cast... mit MinGW gelingt es, während es mit Visual C ++ nicht 9

  • MinGW "ignoriert" die Besetzung und kehrt die reale Adresse von std::endl;
  • Visual C ++ 9 tatsächlich wirft die Zeiger-to-Endl und gibt eine andere Adresse.

ich den Test auf if ( p_manip == std::endl ) geändert und nun verhält es sich wie erwartet.

Meine Frage ist, : Was ist die Logik hinter solch komplizierte (und, wie in der Tat, falsch) Test


Aus Gründen der Vollständigkeit:

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&) );
};
War es hilfreich?

Lösung 2

Weitere Informationen:

Die Anweisung if ( p_manip == std::endl ) nicht kompiliert auf dem Original-Compiler (gcc 3.4.5, der Compiler auf dem der Code wurde ursprünglich entwickelt).

Das bedeutet, dass der Test nicht falsch war, als ich in meiner Frage angegeben.

Andere Tipps

Bei einer Vermutung, ich der ursprüngliche Autor würde sagen, haben sie kompatible Typen nicht klar waren, und hat die Umwandlung auf spec (ohne den Compiler erfordern ihn).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top