簡體   English   中英

比較實現C ++映射不完整類型

[英]Comparison implementation C++ map incomplete type not allowed

我正在嘗試實現自定義的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 implementatation

您在類ObjectFinder聲明了第二個CmpTabletKey 實例化地圖時,您位於類中,因此這是編譯器找到的類。 只需刪除class CmpTabletKey; 類中的語句(或將其更改為typedef到::CmpTabletKey ,或將::CmpTabletKey的整個定義CmpTabletKeyObjectFinder

另外,您的比較功能看起來有些奇怪。 在我看來,只有在鍵相等時才能返回true ,這沒有定義排序關系。 如果您只想比較第一個字段:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM