我有以下编译错误,我该如何解决?
error: instantiated from `_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = ar, _Tp = int, _Compare = std::less<ar>, _Alloc = std::allocator<std::pair<const ar, int> >]'
这是代码:
#include <map>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstdlib>
using namespace std;
class ar {
public:
int a;
int b;
int c;
public:
ar() : a(0), b(0), c(0) {}
};
int main() {
map<ar, int> mapa;
ar k;
k.a = 6;
k.b = 1;
k.c = 0;
mapa[k] = 1;
//system("pause");
return 0;
}
答案 0 :(得分:1)
您需要map
的比较功能。您可以创建比较operator<
的两个实例的ar
,也可以创建自定义函数并将其作为第3个模板参数传递。
前者的一个例子可能是:
class ar {
...
bool operator<(const ar& rhs) const {
return std::tie(a,b,c) < std::tie(rhs.a, rhs.b, rhs.c);
}
...
};
答案 1 :(得分:1)
对于std::map
,您需要在地图的Key类型上重载operator<
,因为这是地图将元素插入其底层容器的方式。
class ar {
public:
int a;
int b;
int c;
public:
ar() : a(0), b(0), c(0) {}
bool operator<(const ar& other) const;
};
bool ar::operator< (const ar& other) const // note the function has to be const!!!
{
return (other.a < a) && (other.b < b) && (other.c < c); // or some such ordering
}
当重载operator<
时,以类似的方式加载operator>
也是一个好主意。
答案 2 :(得分:0)
operator <
必须可用于密钥类型,或者您应该为地图构造函数提供比较仿函数。