c++ - 显式特化模板、静态与重复符号

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

在我继承的一堆遗留代码中,单元测试是使用Boost.Test实现的.启用检查 std::wstringicu::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,我会在链接时得到多重定义。而且我不能将所有内容都放在匿名命名空间中,我可以吗,因为我必须在 boost::test_tools::tt_detail 中专门化模板?

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

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

最佳答案

static换成inline就可以了。

关于c++ - 显式特化模板、静态与重复符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27981096/

相关文章:

c++ - 如何从 std::deque 释放内存?

c++ - 需要建议

c++ - 如何将纹理应用于 OpenGL 中的子网格?

java - 两个并行线程可以异步执行静态 block 吗

c++ - AIX 上 Netbeans 6.8 中的 STL 命名空间问题

php - 试图理解命名空间编码

python - Python命名空间的解释

c++ - 打印出动态数组中的项目

C# 静态成员在构造函数中初始化后获取 null

objective-c - 在 Objective C 类中使用静态 c 变量