我正在尝试实现自定义C ++比较函数,以传递给std::map
。
按照map
API中的说明,我实施了:
35 typedef std::pair<uint64_t, KeyHash> TabletKey;
36
37 class CmpTabletKey {
38 public:
39 bool operator()(const TabletKey& key1, const TabletKey& key2) const {
40 if (!(key1.first < key2.first)) {
41 return false;
42 }
43 if (!(key2.first < key1.first)) {
44 return false;
45 }
46
47 return true;
48 }
49 };
在map
属性的类中,我有:
55 class ObjectFinder {
56 public:
57 class TableConfigFetcher; // forward declaration, see full declaration below
58 class CmpTabletKey;
// .. more code here
private:
97 std::map<TabletKey, ProtoBuf::Tablets::Tablet, CmpTabletKey> tableMap;
}
我收到以下错误:
/home/ribeiro.phillipe/ramcloud/src/ObjectFinder.h:97: instantiated from here
/usr/lib/gcc/x86_64-redhatlinux/4.4.6/../../../../include/c++/4.4.6/bits/stl_tree.h:453:
error: incomplete type ‘RAMCloud::ObjectFinder::CmpTabletKey’ not allowed
In file included from /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/map:60,
我不知道为什么会这样。此外,我愿意使用std::less
实现less
答案 0 :(得分:3)
你在课堂上宣布第二个CmpTabletKey
ObjectFinder
;在实例化地图时,你就在里面
class,所以这是编译器找到的那个。放下吧
类中的class CmpTabletKey;
语句(或更改它
到typedef到::CmpTabletKey
,或移动整个定义
在课程CmpTabletKey
中ObjectFinder
。
另外,你的比较功能看起来有点奇怪。它看起来
对我来说,如果钥匙相等,它只能返回true
,
它没有定义排序关系。如果你只是想要
比较第一个字段:
bool operator()( TabletKey const& lhs, TabletKey const& rhs ) const
{
return lhs.first < rhs.first;
}
应该这样做。
答案 1 :(得分:1)
通常,在实例化模板时,必须完全定义作为模板参数传递给标准库模板的类型。 (例外是智能指针模板)
这也适用于std::map
的比较器,因此前向声明不够,您必须提供CmpTabletKey
的完整定义来定义您的
std::map<TabletKey, ProtoBuf::Tablets::Tablet, CmpTabletKey> tableMap;
//^^^------- needs full definition