自定义 std::set 比较器 - 不匹配调用 [...]
Custom std::set comparator - No match for call to [...]
我已经在模板化 class 中将已接受的答案应用到 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 = {};
};
现在我正尝试在这个 class 的方法之一中使用 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
class,我使用 <long long, void *>
,所以这就是编译错误中显示的类型的来源。任何人都可以解释为什么我会收到此错误,以及可能的修复方法吗?
您有两个集合的比较器,但您在值为 key_type
的集合上调用 std::lower_bound()
。也就是说,您正在搜索集合中的键。但是你的比较器不支持set < long long int
,只支持set < set
.
也许您需要定义一个额外的比较器:
bool operator() (const std::set<Node<T, S>>& lhs, const T& rhs) const;
我已经在模板化 class 中将已接受的答案应用到 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 = {};
};
现在我正尝试在这个 class 的方法之一中使用 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
class,我使用 <long long, void *>
,所以这就是编译错误中显示的类型的来源。任何人都可以解释为什么我会收到此错误,以及可能的修复方法吗?
您有两个集合的比较器,但您在值为 key_type
的集合上调用 std::lower_bound()
。也就是说,您正在搜索集合中的键。但是你的比较器不支持set < long long int
,只支持set < set
.
也许您需要定义一个额外的比较器:
bool operator() (const std::set<Node<T, S>>& lhs, const T& rhs) const;