словарь — реализация сравнения C ++ карта неполного типа не допускается

Я пытаюсь реализовать пользовательскую функцию сравнения 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 Меньше

0

Решение

Вы объявляете секунду CmpTabletKey внутри класса
ObjectFinder; создавая карту, вы находитесь внутри
класс, так что это тот, который компилятор находит. Просто бросьте
class CmpTabletKey; утверждение внутри класса (или изменить его
чтобы определить ::CmpTabletKeyили переместить все определение
из CmpTabletKey внутри класса ObjectFinder,

Кроме того, ваша функция сравнения выглядит немного странно. Это выглядит
мне это может только вернуть true если ключи равны,
который не определяет отношения заказа. Если вы просто хотите
сравнить первое поле:

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

должен сделать свое дело.

3

Другие решения

Обычно типы, которые передаются в качестве параметров шаблона в стандартный шаблон библиотеки, должны быть полностью определены при создании экземпляра шаблона. (Исключение составляют шаблоны умных указателей)
Это относится и к компаратору для std::map, так предварительной декларации недостаточно, Вы должны предоставить полное определение CmpTabletKey определить ваш

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

По вопросам рекламы [email protected]