2010-02-23 3 views
1
내가 기존 코드의 조각을 검사 및 Visual C++ 9는 MinGW 컴파일 때 다르게 동작 발견하고

: 이름에서 알 수 있듯이비교 주소 :: endl의

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<<()을 오버로드합니다. 이 다르게 동작하는 이유

나는 발견 : 그것은 비주얼 C와 함께 실패 ++ 9.

  • 는 MinGW 캐스트를 "무시"를 std::endl의 실제 주소를 반환하면서 테스트 p_manip == static_cast...이는 MinGW와 성공;
  • Visual C++ 9 실제로 포인터를 to-endl 캐스팅하고 다른 주소를 반환합니다.

테스트를 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&)); 
}; 
+0

소스 컨트롤에 테스트가 작성되었다고하는 시점은 언제입니까? 그 당시 연산자 ==()가 이러한 유형에 대해 작동하지 않았을 수 있습니다. – Bill

답변

0

:

if (p_manip == std::endl) 원래 컴파일러에서 컴파일되지 않습니다 문 (GCC 3.4.5 컴파일러되는 코드는 원래 개발되었다).

즉, 내 질문에 언급 한 것처럼 테스트가 잘못되지 않았다는 의미입니다.

0

추측에, 나는 원래 저자들이 호환 유형을했고, 컴파일러없이 (사양에 전환했다 몰랐어요 말하고 싶지만 그를 필요로 함). 자세한 내용은