明确专门化模板,静态与重复符号

时间:2015-01-16 09:45:11

标签: c++ static namespaces template-specialization boost-test

在我继承的一堆遗留代码中,单元测试是使用Boost.Test实现的。要通过std::wstring启用检查BOOST_CHECK_EQUAL()icu::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中专门化模板吗?

我对如何解决这个问题感到茫然(没有完全重构所有测试以使用a custom predicate代替BOOST_CHECK_EQUAL())......?

请注意,遗憾的是,此时C ++ 11不是一个选项,因为并非所有目标平台都有适当的编译器支持。

1 个答案:

答案 0 :(得分:1)

static替换为inline,它就可以了。