我有一个模板类,如下所示(为简洁起见,假设为 using namespace std
):
template <typename Type, typename Compare = less<Type>>
struct weighted_base
{
typedef typename set<pair<Type, double>, set_compare<Type, Compare>> mapped_type;
map<Type, mapped_type, Compare> backing_map;
...
};
哪里set_compare
定义为:
template <typename Type, typename Compare>
struct set_compare
{
bool operator()(const pair<Type, double>& a,
const pair<Type, double>& b)
{
return Compare(a.first, b.first);
}
};
也就是说, map 采用 Type
类型的键至 std::set<std::pair<Type, double>>
值。当我使用如下方法时会出现一些问题:
void insert(const Type& from, const Type& to, double weight)
{
//...
mapped_type& adj_nodes = backing_map[from];
adj_nodes.insert(make_pair(to, weight));
}
问题是在 set
内, 当它去打电话时 set_compare
, 它的类型是 const Type&
, 不是 Type
.因此,假设它是 std::less
,在这种情况下,它将尝试调用 less<int>::less(const int& a, const int& b)
失败了。
是否有某种方法可以修复它,以便两个 contains 可以在这里(有效地)使用相同的比较函数?
最佳答案
Compare
是二元仿函数的类型,所以你可能需要
return Compare()(a.first, b.first);
哪里Compare()
是临时的,默认构造的,Compare
实例。例如,如果您替换为 Compare
对于 std::less<int>
,
std::cout << std::boolalpha;
std::cout << std::less<int>(5,50) << "\n"; // Error!
std::cout << std::less<int>()(5,50) << "\n"; // OK
您的错误可能会给您带来许多编译器错误,其中一些可能会让您误入歧途。我建议先修复它,然后查看代码的行为是否符合您的预期。
关于c++ - 使用引用类型的比较函数失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12461476/