2017-10-19 2 views
1

나는 높거나 낮게 검색했으나 대답을 찾지 못했습니다. 그러므로 이것이 중복되면 변명하십시오.C++ operator << std :: ostream 대신 call :: ostream

저는이 천년기로 가볍게 변환하려고하는 아주 오래된 C++ 코드가 있습니다. 이 코드는 여전히 Visual Studio 6에서 컴파일되고 계속해야하지만 Visual Studio 2017에서이 코드를 사용하려고합니다. 이전에이 작업을 수행했지만 헤더 파일 등을 많이 변경 했으므로 이번에는 더 많은 측정 방법을 시도합니다.

코드는 이미 stl과 non-stl, old 및 new io 헤더 등을 혼합하여 사용하므로 폭발하기가 기다리고 있습니다.

간단한 시작으로, 나는 무엇이 일어날지를보기 위해 iostream.h를 iostream로 대체했습니다. 코드에 :: ostream이 들어있는 컴파일러 오류가 발생하여 std :: ostream으로 변경하면 문제가 해결됩니다. 다음으로 오버로드 된 < < 연산자에 문제가 발생합니다. 거기에있는 모든 비트가 std :: iostream을 사용하지만, < < 명령이 대신 ostream (또는 basic_ostream)을 사용하려고합니다.

무엇이 누락 되었습니까? 이전의 io 클래스를 가져 오는 헤더 파일을 조금 더 변경해야한다고 가정합니다.

inline std::ostream& operator<<(std::ostream& os, const PrinterInfo& pi) 
{ 
    os << pi.Idx() << ": " << pi.Name() << ", " 
      << PrinterInfo::MapPrinterType(pi.GetPrinterType()) << ", " 
      << PrinterInfo::MapPaperType(pi.GetPaperType()) << ", " 
      << PrinterInfo::MapPrintFormat(pi.GetPrintFormat()) << ", " 
      << PrinterInfo::MapRasType(pi.GetRasType()) << ", " 
      << PrinterInfo::MapNPS(pi.NPS()) << ", " 
      << "dpx = " << pi.Duplex() << ", " 
      << "tray = " << pi.Tray2() << ", " 
      << "port = " << pi.PortNo(); 

    return os; 
} 

PrinterInfo 클래스뿐만 아니라 < < 운영자에 대한 재정의가 있습니다

inline std::ostream& operator<<(std::ostream& os, const PrinterOption& po) 
{ 
    os << "(" << po.Installed() << ", " << po.Enabled() << ")"; 
    return os; 
} 
+0

별도의 네임 스페이스에'PrinterOption' 또는'PrinterInfo'가 있습니까? – Slava

+0

예,이 코드의 대부분은 90 년대에 작성되었으므로 일반적인 네임 스페이스에서는 아무 것도 지정되지 않았습니다. –

+0

그럼이 코드의 문제점은 무엇입니까? 당신은 어떤 결과를 기대합니까, 당신은 무엇을 관찰하고, 어떻게 다른가? 컴파일러 오류, 예기치 않은 결과, 다른 것을 얻습니까? –

답변

1

내가 그 경우인지 알고 있지만 그나마 당신은 클래스 헤더 파일 내부 함수의 본문을 구현하는 경우 인라인 키워드를 제거, 나는 비슷한 문제가 있었고 2-3 일 내내 이것을 낭비하고 많은 양을 낭비했습니다 ...

+0

나는 그것을 시도 할 것이다. –

+0

이동하십시오. 이 두 연산자를 cpp 파일로 옮겨서 작동했습니다. 감사! –

+0

정확히 말하면 인라인은 실제로 작은 함수를 여러 번 호출하는 오버 헤드를 피하기 위해 호출이 발생하는 함수 본문을 복사하기 때문에 포함 오류입니다. 따라서 링커는 논리적으로 이미 다른 곳에서 사용 된 헤더 파일을 여러 번 포함하는 것에 대해 불평합니다. –

관련 문제