我有点简单,因为我不太能够在下面标记为错误的行上清楚地看到此错误的原因。
std :: sort和boost :: sort选择默认谓词,但是range-v3出于某种原因而没有。这是范围-v3 0.36。在clang 6/7和gcc 7/8上出现类似的错误。
#include <range/v3/all.hpp>
#include <algorithm>
#include <boost/hana.hpp>
#include <utility>
#include <vector>
#include <boost/range/algorithm.hpp>
namespace hana = boost::hana;
template< typename T = int>
struct point_t {
BOOST_HANA_DEFINE_STRUCT(point_t<T>, (T, x), (T, y));
constexpr bool operator<(const point_t<T> &b) const noexcept {
return hana::less(hana::to_tuple(*this), hana::to_tuple(b));
};
};
int main() {
std::vector<point_t<point_t<>>> all;
boost::sort(all); // OK
std::sort(std::begin(all), std::end(all)); //OK
ranges::sort(all, std::less<point_t<point_t<>>>()); // OK
ranges::sort(all, hana::less); // OK
ranges::sort(all); // error no matching function for call to object of type 'const with_braced_init_args<ranges::v3::sort_fn>'
return 0;
}
答案 0 :(得分:3)
Casey通过range-v3 issue list迅速回答。
以下是他根据要求提供的文字注释,而不是我在此处放置的原始图像:
ranges::sort
(不带比较器参数)要求类型为 排序以模拟StrictTotallyOrdered
概念。那意味着 该类型必须定义==
,!=
,<
,>
,<=
和>=
的全部, 一致的学期。
我在那回复了
感谢您这么快回来。我现在知道了。我必须说 有点令人失望的是,它与
std::sort
不兼容,并且boost::sort
个要求。这就是我们为range-v3
支付的价格 我猜很可爱。再次感谢,-马特。
不幸的是,要求高于std::sort
和boost::sort
,因此代码不能正常工作。我了解动机。
出于好奇,std::rel_ops
和boost/operators
似乎干扰了我对自省结构的总体初始化支持的目标,因此,不幸的是,我最终求助于宏(类似于下面的内容)。
我将继续玩一些游戏,并寻求更好的静态多态解决方案。
亲切的问候,
-马特。
#define JEST_STRUCT(T) \
constexpr bool operator==(const T &b) const noexcept { \
return hana::equal(hana::to_tuple(*this), hana::to_tuple(b)); \
}; \
\
constexpr bool operator!=(const T &b) const noexcept { \
return hana::not_equal(hana::to_tuple(*this), hana::to_tuple(b)); \
}; \
\
constexpr bool operator<(const T &b) const noexcept { \
return hana::less(hana::to_tuple(*this), hana::to_tuple(b)); \
}; \
\
constexpr bool operator<=(const T &b) const noexcept { \
return hana::less_equal(hana::to_tuple(*this), hana::to_tuple(b)); \
}; \
\
constexpr bool operator>(const T &b) const noexcept { \
return hana::greater(hana::to_tuple(*this), hana::to_tuple(b)); \
}; \
\
constexpr bool operator>=(const T &b) const noexcept { \
return hana::greater_equal(hana::to_tuple(*this), hana::to_tuple(b)); \
}