我想知道为什么我不能将 STL 映射与用户定义的类一起使用。当我编译下面的代码时,我收到以下神秘的错误消息。这是什么意思?另外,为什么它只发生在用户定义的类型上? (原始类型用作键时是可以的。)
C:\MinGW\bin..\lib\gcc\mingw32\3.4.5........\include\c++\3.4.5\bits\stl_function.h||中
成员函数`bool
std::less<_tp>::operator()(const _Tp&,
const _Tp&) const [与 _Tp =
1 类]':|
C:\MinGW\bin..\lib\gcc\mingw32\3.4.5........\include\c++\3.4.5\bits\stl_map.h|338|实例化
来自 `_Tp& std::map<_key _tp _compare _alloc>::operator[](const _Key&) [其中 _Key = Class1, _Tp = int, _Compare = std::less, _Alloc = std::allocator >]'|
C:\Users\Admin\Documents\dev\sandbox\sandbox\sandbox.cpp|24|实例化
从这里|
C:\MinGW\bin..\lib\gcc\mingw32\3.4.5........\include\c++\3.4.5\bits\stl_function.h|227|错误:与“运算符”不匹配
#include <iostream>
#include <map>
using namespace std;
class Class1
{
public:
Class1(int id);
private:
int id;
};
Class1::Class1(int id): id(id)
{}
int main()
{
Class1 c1(1);
map< Class1 , int> c2int;
c2int[c1] = 12;
return 0;
}
你不have界定operator<
实际上,对于你的班级来说。您还可以为其创建一个比较器函数对象类,并使用它来专门化std::map
。扩展你的例子:
struct Class1Compare
{
bool operator() (const Class1& lhs, const Class1& rhs) const
{
return lhs.id < rhs.id;
}
};
std::map<Class1, int, Class1Compare> c2int;
恰好第三个模板参数的默认值std::map
is std::less,这将委托给operator<
为您的班级定义(如果没有则失败)。但有时您希望对象可用作映射键,但实际上您没有任何对象有意义的比较语义,所以你不想通过提供来混淆人们operator<
就为了这个而在你的课堂上。如果是这样的话,你可以使用上面的技巧。
实现同样目标的另一种方法是专业化std::less
:
namespace std
{
template<> struct less<Class1>
{
bool operator() (const Class1& lhs, const Class1& rhs) const
{
return lhs.id < rhs.id;
}
};
}
这样做的好处是它会被选择std::map
“默认情况下”,但你不暴露operator<
否则到客户端代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)