gpt4 book ai didi

c++ - BOOST_CHECK_EQUAL 与 pair 和自定义运算符 <<

转载 作者:可可西里 更新时间:2023-11-01 18:09:20 25 4
gpt4 key购买 nike

当尝试执行 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’

最佳答案

operator<<std喜欢Remus's answer是 C++ 14 草案(N4296 部分:17.6.4.2.1)中的未定义行为。 Boost 提供了一个钩子(Hook)(used by this answer),你可以这样写:

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*/ };

编辑

如果您使用的是 boost 1.59 或更高版本,则需要使用命名空间 boost::test_tools::tt_detail反而。即代码需要开始:

namespace boost
{
namespace test_tools
{
namespace tt_detail
{

关于c++ - BOOST_CHECK_EQUAL 与 pair<int, int> 和自定义运算符 <<,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10976130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com