【问题标题】:Explicitly specializing template, static vs. duplicate symbols明确专门化模板、静态与重复符号
【发布时间】:2015-01-16 09:45:11
【问题描述】:

在我继承的一堆遗留代码中,单元测试是使用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 中专门化模板?

我不知道如何解决这个问题(没有将所有测试完全重构为使用a custom predicate 而不是BOOST_CHECK_EQUAL())...?

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

【问题讨论】:

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


    【解决方案1】:

    static替换为inline就可以了。

    【讨论】:

    • 您,先生,应该获得奖章。 (不知何故,这么多年来,我始终无法在脑海中敲定inline 可用于指示链接范围以及优化提示...)
    猜你喜欢
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多