iostream 확장시 MSVC ++ 오류
-
29-10-2019 - |
문제
내 응용 프로그램에 대한 출력 관리자 클래스를 작성 중이며 제 클래스는 Linux에서 g ++에서 작동하지만 MSVC ++ 2010에서는 컴파일되지 않습니다.
다음은 내 프로그램의 SSCCE 버전입니다. 라코 디스
g ++에서는 잘 실행되지만 MSVC에서는 컴파일러 오류가 발생합니다. 라코 디스
어떤 도움이라도 대단히 감사하겠습니다. 기욤
[편집]
이 조언 덕분에 저는 이미 멤버 변수로 ofstream을 가지고 있기 때문에 iostream을 확장하는 것이 유용하지 않다는 것을 깨달을 수있었습니다.std 라이브러리의 내부 작업에 대해 충분히 알지 못하기 때문에 클래스를 독립적으로 만들었고 MSVC와 g ++에서 모두 작동했습니다. 라코 디스
해결책
문제의 핵심은 GCC가 처리하는 방법을 알고있는 것처럼 보이지만 MSVC ++는 그렇지 않은 스트림에 함수 포인터를 보내는 것입니다. 어느 쪽이든, debug
/ endl
/ flush
/ memory
함수의 주소를 저장하고 싶었던 것 같지 않습니다.
다음 단계는 표시하는 기능 대신 객체 를 만드는 것입니다.
그러나이 코드에는 많은 문제가 있습니다. 즉, 여러분이 사용해야하는 endl
및 flush
객체가 이미 존재합니다. 또한 각 BasicE3OutStream
에는 세 기본 스트림이 있습니다. 하나는 상속되고 모든 기능이 작동하는 것입니다 (endl
등을 포함하여 내가이를 대체 한 이유라고 생각합니다), mBuffer
및 mLineBuffer
( 어떤 구성원도 당신이하는 일에 필요하지 않습니다). (또 다른 참고 사항, 배치가 아닌 mLineBuffer.str("");
로 stringstream 재설정 new)
원하는 작업을 쉽게 수행 할 수있는 방법은 operator<<
의 각 basic_ostream
멤버를 오버로드하는 것입니다. 줄 바꿈이있는 곳에 [DEBUG]
또는 [MEMORY]
를 적절하게 삽입하면 버퍼링 할 필요가 없습니다. (내가 해봤는데 미친 짓이 아니에요)
다른 문자 특성을 가진 스트림을 사용하거나 특정 가상 함수를 오버로딩하거나 버퍼를 교체하여이를 수행하는 올바른 방법이있을 수 있지만 스트림이 복잡하고 모르겠습니다. 오른쪽 .