当尝试执行 BOOST_CHECK_EQUAL(pair,pair) 时,
尽管声明了它,但 gcc 找不到pair的流运算符。
有趣的是 std::out 找到了运算符。
ostream& operator<<(ostream& s, const pair<int,int>& p) {
s << '<' << p.first << ',' << p.second << '>';
return s;
}
BOOST_AUTO_TEST_CASE(works)
{
pair<int,int> expected(5, 5);
pair<int,int> actual (5, 5);
std::cout << expected << std::endl;
std::cout << actual << std::endl;
BOOST_CHECK(actual == expected);
}
BOOST_AUTO_TEST_CASE(no_work)
{
pair<int,int> expected(5, 5);
pair<int,int> actual (5, 5);
BOOST_CHECK_EQUAL(actual, expected);
}
这不会编译并出现错误:
... instantiated from here
../boost-atp/release/include/boost/test/test_tools.hpp:326:9: error: no match for ‘operator<<’ in ‘ostr << t’
Putting operator<<
in std
like 莱姆斯的回答是 C++ 14 草案中未定义的行为(N4296 部分:17.6.4.2.1)。 Boost提供了一个钩子(此答案使用的),你可以写:
namespace boost
{
namespace test_tools
{
template<typename T,typename U>
struct print_log_value<std::pair<T, U> >
{
void operator()(std::ostream& os, std::pair<T, U> const& pr)
{
os << "<" << std::get<0>(pr) << "," << std::get<1>(pr) << ">";
}
};
}
}
print_log_value
是一个模板,因此如果您没有声明模板化值,例如pair<T,U>
,您需要编写如下内容:
template<>
struct print_log_value<MyType>{ /* implementation here*/ };
Edit
如果您使用 boost 1.59 或更高版本,则需要使用命名空间boost::test_tools::tt_detail
反而。也就是说,代码需要启动:
namespace boost
{
namespace test_tools
{
namespace tt_detail
{
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)