1

我有一个模板类,如下所示(using namespace std为简洁起见,假设为 a):

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);
     }
};

也就是说,映射将类型的键作为Typestd::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)which 失败。

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

4

1 回答 1

4

Compare是二元仿函数的类型,所以你可能需要

return Compare()(a.first, b.first);

whereCompare()是一个临时的、默认构造的 Compare实例。例如,如果您替换Comparestd::less<int>

std::cout << std::boolalpha;
std::cout << std::less<int>(5,50) << "\n"; // Error!
std::cout << std::less<int>()(5,50) << "\n"; // OK

您的错误可能会给您带来许多编译器错误,其中一些可能会使您走错路。我建议先修复它,然后查看代码的行为是否符合您的预期。

于 2012-09-17T14:37:24.940 回答