我有一个模板化的类,如下所示(为简洁起见假设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);
}
};
也就是说,地图会将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)
。
是否有某种方法可以修复它,以便两个包含可以在这里使用(有效)相同的比较函数?
答案 0 :(得分:4)
Compare
是二元仿函数的类型,因此您可能需要
return Compare()(a.first, b.first);
其中Compare()
是临时的,defualt构造的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
您的错误可能会给您带来许多编译错误,其中一些错误可能会导致错误的跟踪。我建议先修复它,然后查看代码是否符合您的预期。