【发布时间】:2016-06-18 11:30:55
【问题描述】:
我正在从binsearch.hpp 测试我的二分搜索实现:
template<typename Iterator, typename T>
Iterator binsearch(Iterator begin, Iterator end, const T &v) {
if (std::distance(begin, end) == 0) {return end;}
Iterator save = end;
while (std::distance(begin, end) > 0) {
Iterator mid = begin + std::distance(begin, end) / 2;
if (*mid == v) {
return mid;
}
if (v < *mid) {
end = mid;
} else {
begin = mid + 1;
}
}
return save;
}
使用以下升压驱动单元测试test_binsearch.cpp:
#define BOOST_TEST_MODULE test_binsearch
#define BOOST_TEST_DYN_LINK
#include <boost/test/unit_test.hpp>
#include "binsearch.hpp"
BOOST_AUTO_TEST_CASE(empty_0) {
std::vector<int> xs = {};
const auto result = binsearch(xs.begin(), xs.end(), 42);
BOOST_TEST((result == xs.end()));
}
除非我在 BOOST_TEST 中用一对额外的括号括起来比较,否则我会得到一个非常神秘且冗长的编译错误,它反复尝试将迭代器转换为 char、错误代码和其他一些类型:
注意:不能将't'(类型'const __gnu_cxx::__normal_iterator std::vector >')转换为类型'char'
ostr << t;
我得到了用额外括号 from here 包围我的比较的线索。为什么没有它们就无法编译?
【问题讨论】:
-
宏中缺少括号?
-
@KarolyHorvath 也许,我对宏不太擅长。然而,像
BOOST_TEST(0 == 0)这样简单的事情不需要额外的括号。 -
我不太明白他们的源代码中发生了什么,但他们在宏的参数(没有括号)上使用了一些重载的
operator<<,并且<<的优先级高于==搞砸了起来。 -
试试
std::cout << result;(或std::cout << xs.end();),我怀疑你会遇到类似的错误。 -
@jv_ 是的,错误是完全一样的。我们不能在 C++ 中打印迭代器吗?这很奇怪。