不允许使用比较实现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
实现较少的
您正在类中声明第二个CmpTabletKey
ObjectFinder
;实例化映射时,您在类,所以这是编译器找到的。只要放下类内的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
相关文章:
- 将类型映射到整数值后,如何在给定整数值的情况下恢复类型?
- C++17:在编译时将类型映射到整数值
- 为C++重载函数创建SWIG类型映射
- 返回各种类型的函数的SWIG类型映射
- 类型映射资源并将列表转换为矢量(并返回)
- 有没有办法在 C++17 中创建编译时类型映射以进行类型检查?
- 如何在OpenCV中使用双类型映射进行重新映射
- SWIG 多参数类型映射适用于函数,但如果有多个构造函数,则不适用于构造函数
- Swig:如何类型映射c ++字符串常量和python字符串?
- SWIG 类型映射的 python 列表到双倍 *
- SWIG -- 在扩展中使用类型映射
- 嵌入的多个变体类型映射
- SWIG类型映射中的内存释放
- 您将如何为 std::list<std::string> 创建一个类型映射,以在<String> List in C++ 中为 Java 在 SWIG 中创建?
- SWIG-为具有四个参数的函数创建一个类型映射,该参数传递一个字节数组
- 在C++中将类类型映射到其他类类型
- C func 到C++具有非双射参数类型映射的实例成员蹦床
- Swig 界面中的类型映射错误
- 如何在 swig 中引用类型映射类
- 将实例变量类型映射到模板成员函数