比较实现C++;不允许映射不完整的类型 我尝试实现一个自定义的C++比较函数,传递给 STD::MAP< /COD>。 按照mapAPI中的说明,我实现了: 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 };

比较实现C++;不允许映射不完整的类型 我尝试实现一个自定义的C++比较函数,传递给 STD::MAP< /COD>。 按照mapAPI中的说明,我实现了: 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 };,c++,dictionary,ramcloud,C++,Dictionary,Ramcloud,我得到了以下错误: /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 allo

我得到了以下错误:

/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
实现

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

std::map<TabletKey, ProtoBuf::Tablets::Tablet, CmpTabletKey> tableMap;
                                             //^^^------- needs full definition
std::map tableMap;
//^^^-------需要完整的定义

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

std::map<TabletKey, ProtoBuf::Tablets::Tablet, CmpTabletKey> tableMap;
                                             //^^^------- needs full definition
std::map tableMap;
//^^^-------需要完整的定义

您正在类内声明第二个
CmpTabletKey
ObjectFinder
;实例化地图时,您位于 类,因此这是编译器找到的。放下枪
类CmpTabletKey语句(或更改它
将类型定义移动到
:CmpTabletKey
,或移动整个定义 类内的
CmpTabletKey

另外,比较函数看起来有点奇怪 对我来说,如果键相等,它只能返回
true
, 它不定义排序关系。如果你想 要比较第一个字段,请执行以下操作:

bool operator()( TabletKey const& lhs, TabletKey const& rhs ) const
{
    return lhs.first < rhs.first;
}
bool操作符()
{
返回lhs.first

应该这样做。

您在类中声明了第二个
CmpTabletKey
ObjectFinder
;实例化地图时,您位于 类,因此这是编译器找到的
class CmpTabletKey;
类内的语句(或更改它 将类型定义移动到
:CmpTabletKey
,或移动整个定义 类内的
CmpTabletKey

另外,比较函数看起来有点奇怪 对我来说,如果键相等,它只能返回
true
, 它不定义排序关系。如果你想 要比较第一个字段,请执行以下操作:

bool operator()( TabletKey const& lhs, TabletKey const& rhs ) const
{
    return lhs.first < rhs.first;
}
bool操作符()
{
返回lhs.first

应该这样做。

您不能使用转发声明来实例化
std::map
。一般来说,标准库容器需要完整的类型进行实例化。@juanchopanza您能给我一个示例吗?在实例化映射之前,请确保
CmpTabletKey
的定义可用。您可以不能使用转发声明来实例化
std::map
。一般来说,标准库容器需要完整的类型进行实例化。@juanchopanza您能给我一个如何完成的示例吗?在实例化映射之前,请确保
CmpTabletKey
的定义可用。完全同意,但我应该放在哪里
CmpTabletKey
在类
ObjectFinder
中?我在
ObjectFinder
类的上面实现了它declaration@philippe但是您声明了一个嵌套在类
ObjectFinder
中的新对象,这是一个不完整的对象。@philippe如果您在类外部定义它,则不需要在他完全同意,但是我应该把
CmpTabletKey
放在类
ObjectFinder
中的什么地方呢?我在
ObjectFinder
类的上面实现了它declaration@philippe但是您声明了一个嵌套在类
ObjectFinder
中的新对象,该对象是不完整的。@philippe,如果您在e类,您不需要在类中声明。