显式特化模板、静态与重复符号
Explicitly specializing template, static vs. duplicate symbols
在我继承的一堆遗留代码中,单元测试是通过BOOST_CHECK_EQUAL()
使用Boost.Test. To enable checking std::wstring
and 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 版本接受这个,但今天的版本 (post-4.3-ish) 拒绝它:
error: explicit template specialization cannot have a storage class
但是,如果我 删除 static
,我会在 link 时得到 multiple definition
。而且我不能将所有内容都放在匿名命名空间中,我可以吗,因为我必须将模板专门化为 boost::test_tools::tt_detail
?
我不知道如何解决这个问题(没有将所有测试完全重构为使用 a custom predicate 而不是 BOOST_CHECK_EQUAL()
)...?
请注意,不幸的是,此时 C++11 不是一个选项,因为并非所有目标平台都具有适当的编译器支持。
把static
换成inline
就可以了
在我继承的一堆遗留代码中,单元测试是通过BOOST_CHECK_EQUAL()
使用Boost.Test. To enable checking std::wstring
and 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 版本接受这个,但今天的版本 (post-4.3-ish) 拒绝它:
error: explicit template specialization cannot have a storage class
但是,如果我 删除 static
,我会在 link 时得到 multiple definition
。而且我不能将所有内容都放在匿名命名空间中,我可以吗,因为我必须将模板专门化为 boost::test_tools::tt_detail
?
我不知道如何解决这个问题(没有将所有测试完全重构为使用 a custom predicate 而不是 BOOST_CHECK_EQUAL()
)...?
请注意,不幸的是,此时 C++11 不是一个选项,因为并非所有目标平台都具有适当的编译器支持。
把static
换成inline
就可以了