2012-11-27 3 views
1

언급 한 테스트 프레임 워크에서 내 유형을 출력하고 싶습니다. Google clearly states 가능합니다. Google Test Framework 출력 사용자 정의 유형

namespace foo { 

class Bar { ... }; 

// It's important that PrintTo() is defined in the SAME 
// namespace that defines Bar. C++'s look-up rules rely on that. 
void PrintTo(const Bar& bar, ::std::ostream* os) { 
    *os << bar.DebugString(); // whatever needed to print bar to os 
} 

} // namespace foo 

As mentioned earlier, the printer is extensible. That means you can teach it to do a better job at printing your particular type than to dump the bytes. To do that, define << for your type:

나는이 작업을 수행 한 것으로 보인다. 내가 갖는 컴파일 할 때 그러나 다음

error: no match for ‘operator<<’ in ‘* os << val’ /usr/include/c++/4.4/ostream:108: note: candidates are: 

그것은과 제안의 긴 목록 뒤에 나의 말에 operator<< 과부하 :

std::ostream& Navmii::ProgrammingTest::operator<<(std::ostream&, Navmii::ProgrammingTest::AsciiString&) 

누군가가 도와 줄 수 있습니까?

답변

1

비 const AsciiString 개체에 대해 operator<<을 정의한 것으로 보입니다. Google이 인쇄하려고하는 것은 무엇이든 const 일 것입니다.

std::ostream& Navmii::ProgrammingTest::operator<<(
    std::ostream&, 
    Navmii::ProgrammingTest::AsciiString const&); 

더 이상 연결된 문서의 코드와 일치하는 두 번째 매개 변수를 const 참조로 전달하십시오. 그러나 그 부분은 질문의 인용에서 생략되었습니다.

이 질문은 PrintTo 예제를 인용 한 것입니다. 그 코드는 괜찮지 만, 그것이 당신이 실제로 당신의 코드에서했던 것 같지는 않습니다. 설명서에 따르면 operator<<을 제공하고 싶지 않거나 클래스에 operator<<이 단위 테스트 중에 디버그 출력 목적으로 부적합한 경우 PrintTo을 사용할 수 있습니다.

+0

감사합니다. 이것은 아마도 최악의 경우는 아니지만 컴파일러의 메시지는 매우 혼란 스러울 수 있습니다. – vehsakul

+0

참. 특정 이름의 함수가 하나 뿐인 경우 컴파일러는 예상과 일치하지 않는 매개 변수를 알려줌으로써 도움이 될 수 있습니다. 그러나 하나 이상의 함수가 요청 된 이름 (이 경우'operator <<')과 일치 할 때, 모든 단일 함수가 주어진 사용을 만족시키지 못하는 이유를 설명하려고하면 오류 메시지가 훨씬 더 다루기 힘들어집니다. C++에는 "가장 근접한 불일치"에 대한 개념이 없습니다. 만약 그렇다면, const가 아닌 함수가 "꽤 가깝다"는 것을 알아 낸 다음, 그 단일 함수가 코드에서 사용 된 시도와 어떻게 다른지를 보여 줬을 것입니다. –