我已经确定了三种解决问题的方法operator<<。
第一种方法是operator<<为您的类型提供一个。这是必需的,因为当boost_check_equal失败时,它还会通过调用operator<<对象来记录失败。请参阅休息后的详细附录,以了解这是如何实际完成的。这比看起来更难。
第二种方法是不做我刚才提到的日志记录。你可以通过#definineing来做到这一点BOOST_TEST_DONT_PRINT_LOG_VALUE。要仅对一项测试禁用日志记录,您可以用 this 包围有问题的测试#define,然后立即使用#undef它:
#define BOOST_TEST_DONT_PRINT_LOG_VALUE
BOOST_CHECK_EQUAL (first, second);
#undef BOOST_TEST_DONT_PRINT_LOG_VALUE
第三种方法是通过不将一个项目与另一个项目进行比较,而只是检查一个布尔值来回避operator<<与您的类型一起工作的需要:
BOOST_CHECK (first == second);
选择您喜欢的方法。
我的偏好是第一个,但实施起来非常具有挑战性。如果您只是operator<<在全局范围内定义一个,它将不起作用。我认为这是因为名称解析存在问题。解决此问题的一个流行建议是将 放在operator<<命名std空间中。这至少在某些编译器上是有效的,但我不喜欢它,因为标准禁止向std命名空间添加任何内容。
我发现一个更好的方法是print_log_value为您的类型实现自定义类模板特化。 print_log_value是 Boost.Test 内部使用的类模板,用于实际调用operator<<指定类型的正确值。它委托给一个operator<<做繁重的工作。print_log_valueBoost [需要引用] 正式支持 专门针对您的自定义类型,并因此完成。
假设您的类型被调用Timestamp(它在我的代码中),首先定义一个全局 free operator<<for Timestamp:
static inline std::ostream& operator<< (std::ostream& os, const Mdi::Timestamp& ts)
{
os << "Timestamp";
return os;
}
...然后为其提供print_log_value专业化,委托给operator<<您刚刚定义的:
namespace boost { namespace test_tools {
template<>
struct print_log_value<Mdi::Timestamp > {
void operator()( std::ostream& os,
Mdi::Timestamp const& ts)
{
::operator<<(os,ts);
}
};
}}