c++ - 使用引用类型的比较函数失败

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

也就是说, 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/

相关文章:

C++模板类问题

c++ - 如何提高我的 C++ 程序读取分隔文本文件的速度?

c++ - Lambda 只是重载了 operator() 的类?

c++ - 根据表达式的有效性选择要应用的函数

c++ - 如何专门化容器和枚举的模板

c++ - 使用 STL 排序功能对列表进行排序

java - java 中的 Push_back 和 pop_back

c++ - 为什么使用常量表达式作为模板参数?

c++ - 是否可以在 Mountain Lion 上的当前 Xcode 4.6.1 工具链中启用 _LIBCPP_DEBUG2?

C++ - 为任何 lambda 创建实例化桶