显式专用模板,静态与重复符号
Explicitly specializing template, static vs. duplicate symbols
在我继承的一堆遗留代码中,单元测试是使用 Boost.Test 实现的。为了能够通过BOOST_CHECK_EQUAL()
检查std::wstring
和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
中专门化模板?
我不知道如何解决这个问题(没有将所有测试完全重构为使用自定义谓词而不是BOOST_CHECK_EQUAL()
)...?
请注意,不幸的是,C++11 目前不是一个选项,因为并非所有目标平台都有适当的编译器支持。
将static
替换为inline
就可以了。
相关文章:
- 使用gcc从静态链接的文件中查找可选符号
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 如果我想链接静态库并删除未使用的符号.txt我应该如何处理 Cmakelist
- 限制静态库中符号的可见性 (MSVC/Visual C++)
- 仅在少数方法(静态或共享库)中解析的外部符号
- MSVC2019 静态库中缺少符号名称
- 使用静态 constexpr 成员的未解析外部符号
- 协议缓冲区的静态链接会导致与现有符号冲突
- ctypes,添加静态库时未定义的符号
- 在Qt5上去静态库:架构的未定义符号x86_64:
- 为什么链接器报告全局函数的乘法定义符号,而不是类静态方法
- 覆盖性静态分析说无符号的int是char(C++)
- 作为成员的静态类模板实例会导致未解析的外部符号错误
- DLL 链接静态库 - 未使用函数中未解析的链接器符号
- 如何防止静态库中的重复符号?
- CURL 静态链接未解析的外部符号
- 动态库没有静态库文件的符号
- 使用静态变量未解析的外部符号/未定义的引用时出错
- 未解析的外部符号静态变量(标头中定义的方法使用的变量)
- 奇怪的无符号静态常量不是类模板中的常量表达式