不允许使用比较实现C++映射不完整类型

Comparison implementation C++ map incomplete type not allowed

本文关键字:类型 映射 C++ 比较 实现 不允许      更新时间:2023-10-16

我正在尝试实现一个自定义的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实现较少的

您正在类中声明第二个CmpTabletKeyObjectFinder;实例化映射时,您在类,所以这是编译器找到的。只要放下类内的class CmpTabletKey;语句(或更改它到typedef到::CmpTabletKey,或者移动整个定义类CCD_ 10内的CCD_。

此外,您的比较函数看起来有点奇怪。看起来对我来说,它只能在密钥相等的情况下返回CCD_,其不定义排序关系。如果你只是想比较第一个字段:

bool operator()( TabletKey const& lhs, TabletKey const& rhs ) const
{
    return lhs.first < rhs.first;
}

应该做到这一点。

通常,作为模板参数传递给标准库模板的类型必须在模板实例化时完全定义。(智能指针模板除外)
这也适用于std::map的比较器,因此转发声明是不够的,您必须提供CmpTabletKey的完整定义来定义

std::map<TabletKey, ProtoBuf::Tablets::Tablet, CmpTabletKey> tableMap;
                                             //^^^------- needs full definition