: 이름에서 알 수 있듯이비교 주소 :: 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&));
};
소스 컨트롤에 테스트가 작성되었다고하는 시점은 언제입니까? 그 당시 연산자 ==()가 이러한 유형에 대해 작동하지 않았을 수 있습니다. – Bill