利用比较函数失败,引用类型

时间:2012-09-17 14:30:09

标签: c++ templates stl

我有一个模板化的类,如下所示(为简洁起见假设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)

是否有某种方法可以修复它,以便两个包含可以在这里使用(有效)相同的比较函数?

1 个答案:

答案 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

您的错误可能会给您带来许多编译错误,其中一些错误可能会导致错误的跟踪。我建议先修复它,然后查看代码是否符合您的预期。