2009-09-22 7 views
1

내 프로그램에서 클래스를 테스트하기 위해 CPPUnit을 사용하고 있습니다. 이 클래스 (SCriterionVal)는 많은 유형의 변환 연산자를 가지고 있기 때문에 다소 고유합니다 (본질적으로 동적 유형 값 클래스). CPPUNIT_ASSERT_EQUAL()을 사용하여 테스트하는 테스트 사례를 컴파일 할 때 CPPUnit 헤더 파일 중 하나에서 "operator<<이 모호합니다"라는 컴파일 오류가 발생합니다. 내 형식이 assertion_traits 구조체를 인스턴스화하는 것으로 나타나며 구조체에 OStringStreamoperator<<을 사용하여 작동하는 toString() 메서드가 있습니다.오버로드 연산자 << ostream과 함께 사용하기

다양한 변환이 SCriterionVal에서 사용 가능하며 그 중 일부는 operator<< (예 : 내장 유형)으로 정의되어 있기 때문에 오류 대신 모호한 것으로 가정합니다. 이 문제를 해결하기 위해, 나는이 서명 SCriterionVal의 헤더에 비 멤버 함수를 만든 : 나는 서명이 정확히 일치해야하기 때문에, 그것은 모호성을 해결할 생각

ostream &operator<<(ostream &stream, SCriterionVal val); 

. 그런 행운은 없습니다. 여기서 내가 뭘 잘못하고 있니? 내 유형에 assertion_traits 템플릿을 전문화 할 수 있다고 가정하지만, 테스트 프레임 워크를 수용하는 대신 클래스를 스트림에 배치하는보다 일반적인 문제를 해결할 수 있기를 희망했습니다.

+1

sooo를 코드보다 훨씬 더되는 영어 설명의 또 다른 케이스. –

+1

다른 태그 EBTC (Engish는 Better Then Code)를 작성해야한다고 생각합니다. –

+0

Martin, 귀하의 의견은 냉소적이라고 생각합니다. 내 회사 정책에 위배되므로 코드를 게시 할 수 없습니다. 또한 매우 큰 클래스이며 수십 개의 사용자 정의 유형을 사용하므로 어쨌든 컴파일 할 수 없습니다. – rmeador

답변

2

operator<<을 클래스 정의 내에서 친구 인라인 함수로 정의 해보십시오. 저는 항상이 방법이 가장 효과적이라고 생각합니다. 특히 템플릿에 좋습니다. 예를 들어

는 Boost.Random는 exponential distribution의 선언 내에 operator<<를 정의

template<class CharT, class Traits> 
    friend std::basic_ostream<CharT,Traits>& 
    operator<<(std::basic_ostream<CharT,Traits>& os, const exponential_distribution& ed) 
    { 
    os << ed._lambda; 
    return os; 
    } 
+0

이것은 내가 전에 보지 못했던 흥미로운 기술입니다. 함수가 실제로 메소드입니까, 아니면 여전히 객체에 붙어 있지 않은 함수입니까 (저는 그 용어를 모르겠습니다)? 나는 변화에 대해 현재 컴파일하고 있으므로, 어떻게 진행되는지 알려줄 것이다. – rmeador

+0

@meador : 'friend'는 선언 대신에 함수 정의를 취할 수있다. 그것은 이상하게 보일 수 있습니다 (그것은 분명히 저에게 해당됩니다). 그러나 그것은 그저 그렇습니다. 정의 된 함수는 클래스 내부에 정의되어 있어도 여전히 자유 함수입니다. – sbi

+0

templatized basic_ostream 반환 형식으로 시도하고 내 함수가 값을 반환하는 void 함수가 있다고 불평했다. 나는 그것이 내 컴파일러가 MSVC++ 6이라는 사실과 관련이 있다고 생각한다. 나는 템플릿 대신 단지 "ostream"으로 그것을 recoded했고, 나는 원래 가지고 있던 모호성 에러를 얻는다. 나는 포기 해요. 당신의 대답이 합리적인 컴파일러를 가진 누군가를 도울 것이라는 가정하에 당신에게 +1을 줄 것입니다. – rmeador