В связке устаревшего кода, который унаследовал, модульные тесты реализованы с использованием 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, к сожалению, не является опцией на данный момент, так как не все целевые платформы имеют соответствующую поддержку компилятора.
Вы, сэр, заслуживаете медаль. (Каким-то образом, за все эти долгие годы я никогда не мог забивать себе голову, что «inline» можно использовать для указания области связи, а также подсказки оптимизации ...) – DevSolar