【问题标题】:Custom std::set comparator - No match for call to [...]自定义 std::set 比较器 - 调用不匹配 [...]
【发布时间】:2017-02-19 13:08:00
【问题描述】:

我已将接受的答案应用于模板类中的this question,如下所示:

template <typename T, typename S>
struct sizeCompare {
    bool operator() (const std::set<Node<T, S>>& lhs, const std::set<Node<T, S>>& rhs) const {
        return lhs.size() < rhs.size() || (lhs.size() == rhs.size() && lhs < rhs);
    }
};

template <typename T, typename S>
class Graph {
    private:
        std::set<std::set<Node <T, S>>, sizeCompare <T, S>> cliques = {};
};

现在我正在尝试在此类的一种方法中使用std::lower_bound,为此我想重新使用我的sizeCompare 结构。因此,我遵循了this answer 中的语法,如下所示:

    // Still in Graph.h
    std::set<Node <T, S>> getCliqueOfSize(const lli n) {
        // ...
        typename std::set<std::set<Node <T, S>>, sizeCompare <T, S>>::const_iterator it = std::lower_bound(cliques.begin(), cliques.end(), n, sizeCompare<T, S>());
        // ...
    }

但是,编译它会产生以下错误:

C:/PROGRA~2/CODEBL~1/mingw64/lib/gcc/x86_64-w64-mingw32/6.2.0/include/c++/bits/predefined_ops.h:144:11:
error: no match for call to
(sizeCompare<long long, void*>) (const std::set<Node<long long, void*>, std::less<Node<long long, void*> >, std::allocator<Node<long long, void*> > >&, const long long&)

  { return bool(_M_comp(*__it, __val)); }
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~

错误堆栈表明生成上述方法时发生此错误。 唯一一次实例化Graph 类时,我使用了&lt;long long, void *&gt;,所以编译错误中显示的类型就是从这里来的。谁能解释我为什么会收到此错误,以及如何解决?

【问题讨论】:

    标签: c++ c++11 templates compiler-errors mingw-w64


    【解决方案1】:

    您有两个集合的比较器,但您在一个值为key_type 的集合上调用std::lower_bound()。也就是说,您正在搜索集合中的一个键。但是你的比较器不支持set &lt; long long int,只支持set &lt; set

    也许你需要定义一个额外的比较器:

    bool operator() (const std::set<Node<T, S>>& lhs, const T& rhs) const;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      • 2016-07-07
      • 2010-11-06
      相关资源
      最近更新 更多