2015-01-16 1 views
0

В связке устаревшего кода, который унаследовал, модульные тесты реализованы с использованием Boost.Test. Чтобы включить проверку std::wstring и icu::UnicodeString равенства через BOOST_CHECK_EQUAL(), оригинальный автор реализован явные специализаций шаблонов для 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?

Я в затруднении, как решить эту проблему (за исключением полного рефакторинга всех тестов на использование a custom predicate вместо BOOST_CHECK_EQUAL()) ...?

Обратите внимание, что C++ 11, к сожалению, не является опцией на данный момент, так как не все целевые платформы имеют соответствующую поддержку компилятора.

ответ

1

Замените static на inline, и все будет в порядке.

+0

Вы, сэр, заслуживаете медаль. (Каким-то образом, за все эти долгие годы я никогда не мог забивать себе голову, что «inline» можно использовать для указания области связи, а также подсказки оптимизации ...) – DevSolar