2015-01-16 10 views
0

내가 상속 한 레거시 코드 잔뜩 있음, 단위 테스트는 Boost.Test을 사용하여 구현됩니다. BOOST_CHECK_EQUAL()을 통해 평등에 대한 std::wstringicu::UnicodeString를 확인 가능하게하려면, 원래 저자는 equal_impl()에 대한 명시 적 템플릿 특수화를 구현 :명시 적으로 템플릿을 정적, 중복 기호

// test_utils.hpp 

#include <boost/test/unit_test.hpp> 
#include <unicode/unistr.h> 

namespace boost 
{ 
namespace test_tools 
{ 
namespace tt_detail 
{ 

template<> 
static 
boost::test_tools::predicate_result equal_impl(const std::wstring & wleft, const icu::UnicodeString & uright) 
{ 
    const icu::UnicodeString uleft = w2u(wleft); 
    return uleft == uright; 
} 

template<> 
static 
boost::test_tools::predicate_result equal_impl(const icu::UnicodeString & uleft, std::wstring & wright) 
{ 
    const icu::UnicodeString uright = w2u(wright); 
    return uleft == uright; 
} 

} 
} 
} 

지금,이 구조가 static으로 템플릿 전문 레이블. 나는 오래된 GCC 버전이 가능하지만, 현재의 버전 (이후 4.3 틱이) 그것을 거절 이해 :

error: explicit template specialization cannot have a storage class 

그러나, 나는static를 제거 경우, 내가 링크 한 번에 multiple definition를 얻을. 익명의 네임 스페이스에 모든 것을 넣을 수는 없으므로 템플릿을 전문화해야하므로 boost::test_tools::tt_detail을 사용할 수 있습니까?

이 문제를 해결하는 방법을 놓치고 있습니다 (BOOST_CHECK_EQUAL() 대신 a custom predicate을 사용하여 모든 테스트의 전체 리팩토링이 부족함) ...?

아직까지는 모든 대상 플랫폼에 적절한 컴파일러 지원이 제공되지 않으므로 C++ 11은이 시점에서는 옵션이 아닙니다.

답변

1

staticinline으로 대체하면 문제가 없습니다.

+0

귀하, 메달을받을 자격이 있습니다. (어쨌든, 오랜 세월 동안, 나는'inline'이 링크 범위와 최적화 힌트를 나타 내기 위해 사용될 수 있다는 것을 내 머리 속으로 결코 망칠 수 없었다 ...) – DevSolar