std::set 错误:与 »运算符<« 不匹配
std::set error: no match for »operator<«
我有一个类(extract):
class Package
{
private:
string s_package_name;
float f_boottime;
float f_bytesize;
list <Package> l_depends;
list <Package> l_selects;
}
我想生成许多对象,并在一个唯一的"数组"中列出它们,因此我采取set
,我像这样添加对象:
set<Package> l_tempSet;
Package PackageA(1, 11, "what a package");
Package PackageB(2, 22, "what a 2nd package");
l_tempSet.insert(PackageA);
l_tempSet.insert(PackageB);
编译时收到错误消息:
没有匹配的«operator<»(操作数类型是»const Package»和»const包«)
当点击进入错误消息时,它指向set.h到unique
被调用的行,我认为这是错误。
是真的,c++不能够"唯一"的对象(如在这个例子中)到列表和集合,可以处理简单的数据类型,如int, float等?或者我哪里出错了,请帮助我,我不确定错误到底在哪里。
感谢您的支持
问题是,c++ std::set
是有序的,因此需要通过计算operator<
来对元素进行排序。
基本上你的问题有三个解决方案:
-
为你的类实现
operator<
(在这里看到更多)bool operator<(const Package& other) const { //return true if this < other }
-
使用未排序的集合,如
std::unordered_set
,但你必须实现相等运算符和哈希函数。 -
实现比较器函数并将其作为第二个模板参数传递给
set
:bool smaller (const Package& left, const Package& right) { //return true if left < right; } std::set<Package,std::function<bool(const Package&, const Package&)>> newSet (std::function<bool(const Package&, const Package&)>(smaller));
必须为您的类定义operator<
。否则,set
不能比较它应该存储的对象,因此不能检查它们的唯一性。
当你使用std::set
时,内部实现可能会使用operator <
来安排对象到bucket, RBTree等(因为std::set
是有序的),所以它需要operator <
。编译器默认不提供比较运算符,所以你需要自己实现1。
class Package
{
private:
string s_package_name;
float f_boottime;
float f_bytesize;
list <Package> l_depends;
list <Package> l_selects;
public:
bool operator <(const Package &t) {
/* your logic */
}
}
相关文章:
- Qt SQLite没有查询或参数计数不匹配
- 模板参数推导失败,函数参数/参数不匹配
- 在使用累加时,C++中的运算符+不匹配
- C++ 与操作员不匹配<<
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 与'operator='不匹配(操作数类型'String'且"void")
- C++模板/别名 - 模板参数列表中参数 1 处的类型/值不匹配
- C4018:类内有符号、无符号不匹配
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- 为什么我收到错误:"运算符<<不匹配?
- RE2 不匹配非 ASCII 字符
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- 模板推导:为什么函数指针模板定义在常量和/或引用时不匹配?
- 错误:"模板<类_Tp,类_Dp>类 std::unique_ptr"的模板参数列表中参数 1 的类型/值不匹配
- OpenSSL fips in C++ wrapper Library 如何?错误:指纹不匹配
- 为什么我的数组值与此处的全局变量不匹配?
- 引号之间匹配/不匹配,带有不可避免的引号和多行
- 映射迭代器与运算符不匹配
- C++调用和定义不匹配
- 模板专用化与派生类不匹配