[EDIT - 오래 전 2,500 건의 "주목할만한 질문"이있을 때까지 여기를 잊어 버렸습니다. 사람들이보고 있기 때문에 허용 된 답변에서 과부하에 대한 유용한 정보가 있지만 구체적으로 std::endl
을 확인하는 것은 당시에 깨달은 것보다 훨씬 나쁘고 분명히 잘못된 것입니다.오버로드 된 멤버 함수 문제의이 주소를 어떻게 해결할 수 있습니까?
기본적으로 std::endl
의 효과는 \n
을 스트림에 출력 한 다음 std::flush
으로 플러시하는 것입니다. 그것은 플랫폼과 관계없이, 줄 끝이 실제로 "\ r \ n"인 Windows를 포함합니다. endl
매니퓰레이터는 플랫폼 차이점 WRT 라인이 끝나는 추상화를 수행하지 않으며, C++은 나중에 \n
을 "\ r \ n"(바이너리가 아닌 텍스트 모드 용)으로 변환하여 C와 동일한 방식으로 처리합니다. 나는 C++이 뭔가 다른 것을하고 있다고 생각했다. 매우 강한 가정으로 20 년 동안 의문을 제기하지도 않았지만 틀렸다.
세부 정보는 기억하지 않지만 어쨌든 자신 만의 스트림을 정의하고 스트리밍되는 문자의 대체 출력 (및 변환)을 제공 할 수 있습니다. 모든 조작자가 앞에 사용자 스트림 코드 결과 출력 문자를 봅니다. 그래서 특별한 end-of-line 동작을 제공하려면 \n
(텍스트 파일의 줄 끝 번역 이전에 있음)을 살펴보십시오. ]
hackish입니다.하지만 저는 최근에 표준 스트림처럼 작동 할 스트림 클래스를 구현해야했지만, std :: endl 매니퓰레이터와 특수한 경우를 감지 할 수 있습니다. 특정 메소드 구현에서 내 첫 번째 시도였다 ...이와
mystream& mystream::operator<< (std::basic_ostream<char>& (*p) (std::basic_ostream<char>&))
{
if (p == &std::endl)
{
// Handle special case
}
else
{
m_Underlying_Stream << p;
}
return *this;
}
말썽이 컴파일러는 내가 말하는 겁니다 std::endl
의 어느 과부하 알고하지 않습니다. 다음과 같이 나는 ... 컴파일러 (그리고 또 다른 실험이 증명으로도 할당에 대한),하지만 operator==
에 대한 초기화의 맥락에서 과부하를 해결할 수있다
mystream& mystream::operator<< (std::basic_ostream<char>& (*p) (std::basic_ostream<char>&))
{
typedef std::basic_ostream<char>& (*ENDL_T) (std::basic_ostream<char>&);
const ENDL_T l_ENDL (&std::endl);
if (p == l_ENDL)
{
// Handle special case
}
else
{
m_Underlying_Stream << p;
}
return *this;
}
그것을 해결.
문제의 컴파일러는 MinGW GCC 4.4.0이지만 컴파일러 문제 일 가능성은 낮습니다.
나는 누락 된 const를 갈 필요가있는How to get the address of an overloaded member function?
내 코드가 CONST 문제가있는 경우
은 몰라요 ... 주변의 모습을했고이 질문을 발견했다. 다른 명백한 유형 문제는 볼 수 없습니다.나는 WRT 오버로드 또는 암시 적 캐스팅과 관련하여 모호한 아이디어를 가지고 있지만 구체적인 내용은 없습니다. 그래서 - 첫 번째 예제에서 무엇이 잘못 되었는가, 두 번째 버전에서 수정 된 이유, 함수의 주소를 사용할 때 어떤 과부하가 나는지를 안전하게 설명 할 수있는 사람은 누구든지 명확하게 설명 할 수 있습니까?
BTW - 나는 사람들이 나를 std::endl
의 주소로 직접 테스트하는 것을 좋아하지 않을 것이라고 추측 할 수 있으며, 이것이 깨지기 쉽다는 것을 알 수 있습니다. 누군가 내가 직접 찾아 볼 수없는 std::endl
을 호출하는 자신 만의 조작기를 가질 수 있습니다. 일반적으로 이것은 사실이지만,이 특별한 경우에는 해킹으로 많은 시간을 절약 할 수 있으며 불결함은 중요하지 않습니다.
작품을 나를 위해. _ – kennytm