문제

내 응용 프로그램에 대한 출력 관리자 클래스를 작성 중이며 제 클래스는 Linux에서 g ++에서 작동하지만 MSVC ++ 2010에서는 컴파일되지 않습니다.

다음은 내 프로그램의 SSCCE 버전입니다. 라코 디스

g ++에서는 잘 실행되지만 MSVC에서는 컴파일러 오류가 발생합니다. 라코 디스

어떤 도움이라도 대단히 감사하겠습니다. 기욤

[편집]

이 조언 덕분에 저는 이미 멤버 변수로 ofstream을 가지고 있기 때문에 iostream을 확장하는 것이 유용하지 않다는 것을 깨달을 수있었습니다.std 라이브러리의 내부 작업에 대해 충분히 알지 못하기 때문에 클래스를 독립적으로 만들었고 MSVC와 g ++에서 모두 작동했습니다. 라코 디스

도움이 되었습니까?

해결책

문제의 핵심은 GCC가 처리하는 방법을 알고있는 것처럼 보이지만 MSVC ++는 그렇지 않은 스트림에 함수 포인터를 보내는 것입니다. 어느 쪽이든, debug / endl / flush / memory 함수의 주소를 저장하고 싶었던 것 같지 않습니다.

다음 단계는 표시하는 기능 대신 객체 를 만드는 것입니다.

그러나이 코드에는 많은 문제가 있습니다. 즉, 여러분이 사용해야하는 endlflush 객체가 이미 존재합니다. 또한 각 BasicE3OutStream에는 기본 스트림이 있습니다. 하나는 상속되고 모든 기능이 작동하는 것입니다 (endl 등을 포함하여 내가이를 대체 한 이유라고 생각합니다), mBuffermLineBuffer ( 어떤 구성원도 당신이하는 일에 필요하지 않습니다). (또 다른 참고 사항, 배치가 아닌 mLineBuffer.str("");로 stringstream 재설정 new)

원하는 작업을 쉽게 수행 할 수있는 방법은 operator<<의 각 basic_ostream 멤버를 오버로드하는 것입니다. 줄 바꿈이있는 곳에 [DEBUG] 또는 [MEMORY]를 적절하게 삽입하면 버퍼링 할 필요가 없습니다. (내가 해봤는데 미친 짓이 아니에요)

다른 문자 특성을 가진 스트림을 사용하거나 특정 가상 함수를 오버로딩하거나 버퍼를 교체하여이를 수행하는 올바른 방법이있을 수 있지만 스트림이 복잡하고 모르겠습니다. 오른쪽 .

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top